Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tornado异步HTTP增量返回结果_Python_Asynchronous_Tornado - Fatal编程技术网

Python Tornado异步HTTP增量返回结果

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.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_客户端返回数据时立即返回响应。因此,如果“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()