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

龙卷风流HTTP响应作为AsyncHTTPClient接收块

鲁泰宁
2023-03-14

我试图编写一个龙卷风请求处理程序,它生成异步HTTP请求,并在客户端从异步请求接收数据时将数据返回给客户端。不幸的是,我无法让龙卷风返回任何数据到客户端,直到它的所有异步HTTP请求都完成。

下面是我的请求处理程序的演示。

class StreamingHandler(web.RequestHandler):

    all_requested = False
    requests = []

    @web.asynchronous
    def get(self):

        http_client = httpclient.AsyncHTTPClient()
        self.write('some opening')

        big_request = httpclient.HTTPRequest(url='[some_big_request]', streaming_callback=self.on_chunk)
        small_request = httpclient.HTTPRequest(url='[some_small_request]', streaming_callback=self.on_chunk)

        self.requests.append(http_client.fetch(big_request, callback=self.on_response_complete))
        self.requests.append(http_client.fetch(small_request, callback=self.on_response_complete))

        self.all_requested = True

    def on_chunk(self, chunk):
        self.write('some chunk')
        self.flush()

    def on_response_complete(self, response):
        if self.all_requested and all(request.done() for request in self.requests):
            self.write('some closing')
            self.finish()

我希望对这个处理程序的GET请求最初返回文本“some opening”,然后很快为小请求返回“some chunk”,然后为大请求返回“some chunk”(可能多次),最后返回“some closing”,并关闭连接。相反,在建立连接之后,客户端会等待几秒钟,等待所有请求完成,然后在关闭之前立即接收所有HTTPResponse。

我该如何从龙卷风中获得我想要的行为?

提前谢谢!

共有1个答案

壤驷棋
2023-03-14

gen.coroutine装饰您的方法,并生成一个未来列表。下面是一个简单的例子:

from tornado import gen, web, httpclient

class StreamingHandler(web.RequestHandler):
    @web.asynchronous
    @gen.coroutine
    def get(self):
        client = httpclient.AsyncHTTPClient()

        self.write('some opening')
        self.flush()

        requests = [
            httpclient.HTTPRequest(
                url='http://httpbin.org/delay/' + str(delay),
                streaming_callback=self.on_chunk
            ) for delay in [5, 4, 3, 2, 1]
        ]

        # `map()` doesn't return a list in Python 3
        yield list(map(client.fetch, requests))

        self.write('some closing')
        self.finish()

    def on_chunk(self, chunk):
        self.write('some chunk')
        self.flush()

请注意,即使请求是“向后”生成的,第一个块仍将在大约一秒钟后被接收。如果同步发送,需要15秒。当您异步请求它们时,只需5分钟。

 类似资料:
  • 我见过龙卷风文档和示例,其中self.write方法被广泛用于在超文本标记语言上呈现一些值,其中POST请求在处理程序中运行。但是我找不到关于如何将响应返回给客户的清晰信息。 例如,我正在从我的客户端调用Tornado服务器上的POST请求。接受post请求的代码为: 有了这个,我可以找到cbtp的值,有了,我可以用HTML打印它。但是,相反,我想以JSON格式将这个值返回给客户机,比如我想知道如

  • 我已经建立一个网站一段时间了,我仍然坚持那件事: 我在dbm数据库中为我的网站存储了一些小视频(最多大约400MB),我想在我的网站上播放它们。 我正在使用Tornado python框架手工构建请求处理程序,我想知道如何构建我的处理程序。我从未发现媒体流是如何工作的,也没有在网上找到很多话题。 所以我想要实现的完整结果是在我的网站上有一个网络播放器,在那里我可以请求特定的视频,然后播放它们,而不

  • 问题内容: 我有一个基本的Tornado websocket测试: 我希望能够处理多个连接(似乎已经做到了),而且还能够引用其他连接。我没有一种方法来识别和跟踪单个连接,只是为了能够处理打开连接,接收消息和关闭连接时的事件。 [编辑] 想创建一个dict,其中键是Sec-websocket-key,值是WSHandler对象…。我不确定Sec-websocket-key的可靠性如何。 问题答案:

  • 如何获得我的python龙卷风模块版本的当前版本? 与其他软件包,我可以做到以下几点: 来源:如何检查python模块的版本?

  • 问题内容: 我想用Tornado运行一个用Flask编写的简单应用程序。我该怎么做呢?我想使用Python 2.7和最新的Tornado版本(4.2)。 问题答案: Flask文档用于描述如何执行此操作,但是由于以下性能说明而已被删除。除非所有异步代码都已经用Tornado编写,否则您不需要Tornado来提供Flask应用程序。 关于WSGI的Tornado文档也对此进行了描述。它们还包括一个重

  • 当我阅读tornado源代码时,我希望记录每个接受时间,所以我在上添加一个日志,如下所示: 我的处理程序是一个阻塞函数,它阻塞IOLOOP3S并返回'Hello World'。