gpt4 book ai didi

python - Tornado 异步 HTTP 递增返回结果

转载 作者:太空狗 更新时间:2023-10-30 00:57:04 25 4
gpt4 key购买 nike

据我对 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 接口(interface)编写此代码的任何想法。

我想做的事情的非常模糊的实现(并且在语法上不正确)会像这样

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,即 gen。此外,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)

关于python - Tornado 异步 HTTP 递增返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11900634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com