2011-11-09 48 views
1

應用引擎異步例如:如何將異步調用從應用引擎移植到龍捲風?

from google.appengine.api import urlfetch 

rpc = urlfetch.create_rpc() 
urlfetch.make_fetch_call(rpc, "http://www.google.com/") 

try: 
    result = rpc.get_result() 
    if result.status_code == 200: 
     text = result.content 
     # ... 
except urlfetch.DownloadError: 
    raise 
return text 

如何在龍捲風做到這一點?我試過(使用swirl)的東西,如:

import swirl 

http = tornado.httpclient.AsyncHTTPClient() 
uri = 'http://www.google.com/' 

try: 
    response = yield lambda cb: http.fetch(uri, cb) 
    if response.code == 200: 
     text = result.content 
     # ... 
except tornado.httpclient.HTTPError: 
    raise 
return text 

但我得到一個語法錯誤,因爲我不能有回報,在相同功能的產生......

回答

0

看來,漩渦不提供從協程返回值的任何設施。其他使用此模式的框架(如NDB)可以引發特殊的「返回異常」或產生返回值,但漩渦似乎不提供此選項。相反,您需要重構您的協同程序以不返回值。

0

如果你有一個龍捲風RequestHandler標有該@gen.coroutine裝飾,你可以利用Future S和yield關鍵字來完成你想要的。

對於返回一個異步HTTP結果的簡單情況下獲取的AsyncHTTPClient.fetch方法就足夠了:

class MainHandler(tornado.web.RequestHandler): 
    @gen.coroutine 
    def get(self): 
     def handle_response(response): 
      if response.error: 
       print("Error: %s" % response.error) 
      else: 
       self.write(response.body) 

     http_client = AsyncHTTPClient() 
     yield http_client.fetch('http://www.google.com/', handle_response) 

要創建異步返回任意結果的函數,你要創建自己的Future對象返回給調用者。比方說,你的函數需要做返回自定義值前一個異步網絡獲取:

def get_async_result(): 
    future = Future() 

    def handle_response(response): 
     if response.error: 
      future.set_exception(Exception("Yikes")) 
     else: 
      future.set_result("I, for one, welcome our new robot overlords.") 
    http_client = AsyncHTTPClient() 
    http_client.fetch('http://www.google.com/', handle_response) 
    return future 

class MainHandler(tornado.web.RequestHandler): 
    @gen.coroutine 
    def get(self): 
     result = yield get_async_result() 
     print result # "I, for one, welcome our new robot overlords." 
     # rest of handler here... 

yield聲明在RequestHandler邏輯塊,直到返回Future已經完成,爲您提供結果(或異常)直。

(請注意,as explained here您不能在Google App Engine中使用龍捲風的異步機制。)