Python Tornado异步HTTP增量返回结果
从tornado.gen模块文档中我了解到,tornado.gen.Task由tornado.gen.Callback和tornado.gen.Wait组成,每个Callback/Wait对与唯一键关联Python Tornado异步HTTP增量返回结果,python,asynchronous,tornado,Python,Asynchronous,Tornado,从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"
@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_客户端返回数据时立即返回响应。因此,如果“tornadweb.org”首先返回数据,它应该执行self.write(respose),def get()中的循环应该一直等待其他http_客户端完成。
关于如何使用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
在这种情况下,您不应该使用
内联回调
,即gen
。
所有回调完成后,也将调用self.render
如果要部分返回服务器响应,请部分呈现。
这样想(这是唯一有很大改进空间的想法):
除此之外,实际上还有一个WaitAll方法,它在所有HttpClien完成响应后等待所有结果并返回。 我已在我的tornado分支()中提交了差异。我添加了一个类WaitAny,它是异步WaitAll,并在一个HTTPClient返回结果后立即返回结果 差异位于(),() 示例用法:
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")))
keys = set(["google", "tornado", "python"])
while keys:
key, response = yield tornado.gen.WaitAny(keys)
keys.remove(key)
# do something with response
self.write(str(key)+" ")
self.flush()
self.finish()
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")))
keys = set(["google", "tornado", "python"])
while keys:
key, response = yield tornado.gen.WaitAny(keys)
keys.remove(key)
# do something with response
self.write(str(key)+" ")
self.flush()
self.finish()