從我從tornado.gen模塊docs中瞭解到的是,tornado.gen.Task包含tornado.gen.Callback和tornado.gen.Wait,每個Callback/Wait對與唯一鍵相關聯。 ...Tornado異步HTTP遞歸返回結果
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
http_client = AsyncHTTPClient()
http_client.fetch("http://google.com",
callback=(yield tornado.gen.Callback("google")))
http_client.fetch("http://python.org",
callback=(yield tornado.gen.Callback("python")))
http_client.fetch("http://tornadoweb.org",
callback=(yield tornado.gen.Callback("tornado")))
response = yield [tornado.gen.Wait("google"), tornado.gen.Wait("tornado"), tornado.gen.Wait("python")]
do_something_with_response(response)
self.render("template.html")
因此,上面的代碼將獲得來自不同URL的所有響應。 現在我真正需要做的是在一個http_client返回數據後立即返回響應。因此,如果'tornadoweb.org'首先返回數據,它應該執行self.write(respose)並且def get()中的循環應該繼續等待其他http_client完成。 有關如何使用tornado.gen接口編寫此任何想法。
的什麼,我試圖做會是這樣
class GenAsyncHandler2(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def get(self):
http_client = AsyncHTTPClient()
http_client.fetch("http://google.com",
callback=(yield tornado.gen.Callback("google")))
http_client.fetch("http://python.org",
callback=(yield tornado.gen.Callback("python")))
http_client.fetch("http://tornadoweb.org",
callback=(yield tornado.gen.Callback("tornado")))
while True:
response = self.get_response()
if response:
self.write(response)
self.flush()
else:
break
self.finish()
def get_response(self):
for key in tornado.gen.availableKeys():
if key.is_ready:
value = tornado.gen.pop(key)
return value
return None