据我从tornado.gen模块文档中了解到,tornado.gen.Task由tornado.gen.Callback和tornado.gen.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
这是情况,当你不应该使用inline callbacks
, i.e gen
.
Also self.render
所有回调完成后将被调用。如果您想从服务器部分返回响应 - 部分渲染它。
这样想(这是唯一有很大改进空间的想法):
response = []
@tornado.web.asynchronous
def get(self):
self.render('head.html')
http_client = AsyncHTTPClient()
http_client.fetch("http://google.com",
callback=self.mywrite)
http_client.fetch("http://python.org",
callback=self.mywrite)
http_client.fetch("http://tornadoweb.org",
callback=self.mywrite)
self.render('footer.html')
self.finish()
def mywrite(self, result):
self.render('body_part.html')
self.response.add(result)
if len(self.response) == 3:
do_something_with_response(self.response)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)