【问题标题】:Tornado AsyncHTTPClient() chunksTornado AsyncHTTPClient() 块
【发布时间】:2016-02-20 17:06:09
【问题描述】:

我目前正在使用以下代码获取 URL 的正文:

   httpClient=AsyncHTTPClient()  

    try:
       response=yield httpClient.fetch(url)

       # do something with response.body


    except (HTTPError, IOError, ValueError) as e:
       pass 

但是,获取整个正文似乎不是执行此操作的有效方法,因为我正在搜索 URL 中的一条特定信息。是否有可能而不是获取 URL 的整个正文以分块获取它并在我找到我正在寻找的内容后停止,或者如果需要继续获取?

我也在为许多 URL 执行此操作。我看到你可以使用以下内容:

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

但是,一旦我进入回调,我如何从该函数中获取我需要的信息?我需要将该值与从其他 URL 获得的值相结合...

【问题讨论】:

    标签: tornado


    【解决方案1】:

    streaming_callback 与闭包或部分一起使用:

    def f():
        response = yield client.fetch(url, functools.partial(self.on_fetch, url))
    
    def on_fetch(self, url, chunk):
        # do something with chunk
    

    目前无法从streaming_callback 中取消提取;下载将继续运行直至完成。

    【讨论】:

    • 好的,谢谢本。实际上,我想这样做的唯一原因是一旦我找到我想要的东西就可以通过停止提取来潜在地节省带宽......我已经阅读了关于提取的并行性并认为这可能是一个更好的选择,因为我之前是串行加载
    【解决方案2】:

    看看streaming_callbacktornado.httpclient.HTTPRequest

    如果设置,streaming_callback 将在收到每个数据块时运行,HTTPResponse.bodyHTTPResponse.buffer 在最终响应中将为空。

    Sine 回调可以是一个闭包,它可以访问外部数据。在调用tornado.httpclient.AsyncHTTPClient.fetch 的块中定义此函数。您可以访问所有必要的内容。

    【讨论】:

    • 好的,谢谢,我试试,我需要装饰回调吗?
    • 还有一次在回调中,我发现我需要如何让 fetch 停止执行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多