根据我从 tornado.gen 模块文档中了解到的情况,tornado.gen.Task 由 tornado.gen.Callback 和 tornado.gen.Wait 组成,每个 Callback/Wait 对都与唯一键关联......
@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_clients 完成。关于如何使用 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