当前位置: 首页 > 知识库问答 >
问题:

Tornado异步HTTP递增返回结果

储修谨
2023-03-14

从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()中的html" target="_blank">循环应该一直等待其他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

共有2个答案

伍皓
2023-03-14

除此之外,实际上还有一个WaitAll方法,它在所有HttpClien完成响应后等待所有结果并返回。我已经在我的龙卷风分支中提交了差异(https://github.com/pranjal5215/tornado). 我添加了一个类WaitAny,它是异步WaitAll,并在一个HTTPClient返回结果后立即返回结果。

迪夫在(https://github.com/pranjal5215/tornado/commit/dd6902147ab2c5cbf2b9c7ee9a35b4f89b40790e), (https://github.com/pranjal5215/tornado/wiki/Add-WaitAny-to-make-WaitAll-return-results-incrementally)

示例用法:

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() 
谷梁昊空
2023-03-14

在这种情况下,您不应该使用内联回调,即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)
 类似资料:
  • 问题内容: 我在自己的类中拥有所有异步调用,因此我不想将aync’ly设置为全局变量。为此,我想从我的asunc postProcess方法返回对象,例如字符串。 能做到吗? 下面是我类的一般结构,例如,我想从onPostExecute()返回一个字符串。我看到在其他地方提到了委托,但这似乎很混乱,确定有办法为类或方法提供返回类型吗? 问题答案: 像下面这样 和听众课 你可以这样打电话

  • 我对Firebase/Firestore/Cloud函数相当陌生,一直在尝试一个小项目,在这个项目中,客户端应用程序调用Firebase Cloud函数来生成一些随机键(随机数),将它们添加到Firestore,成功编写后,将这些键返回到客户端应用程序。有点像随机数发生器。 客户端正确调用该函数(根据Firebase控制台),确实生成密钥,检查它们是否存在于Fi还原中,如果不添加它们。所有的工作直

  • 我正在使用带有节点的数据库。js。以下请求可以正常工作: 我想异步返回多个的结果,但以下操作失败: 然后我必须在每个元素上调用,所以在调用函数时: 然而我得到: 还有点奇怪: 我怀疑我遗漏了的工作方式,那么如何返回多个结果的已实现结果呢?

  • 我一直在使用异步任务来访问web服务器,并使用结果更新控件。这有缺点,即它使异步方法特定于控件,并阻止我再次使用返回的字符串。 我的典型asyncTask代码如下

  • 问题内容: 我如何才能使此代码返回值 而不冻结浏览器 。 您当然可以用新方法重写它。 编辑: 我需要至少在其他时间从php文件中获取20个变量。 问题答案: 这是不可能的。 Javascript在UI线程上运行;如果您的代码等待服务器回复,则浏览器必须保持冻结状态。 相反,您需要使用回调返回值: 请注意,这两个回调将以不可预测的顺序运行。 您应该修改设计,以便可以在单个AJAX请求中获得所有二十个

  • 更新 我已经读了十几篇关于这个话题的文章,但没有一篇涉及到这个基本问题。我将在本文末尾列出一个参考资料部分。 原始帖子 我对函数的理解是,它返回一个promise。 MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function 在我的程序中,我可以编写如下内容: 我