龙卷风从 on_chunk() 中取消 httpclient.AsyncHTTPClient fetch()

Tornado cancel httpclient.AsyncHTTPClient fetch() from on_chunk()

在其中一个处理程序中,我正在执行以下操作:

    async def get(self):
          client = httpclient.AsyncHTTPClient()
          url = 'some url here'
          request = httpclient.HTTPRequest(url=url, streaming_callback=self.on_chunk, request_timeout=120)
          result = await client.fetch(request)
          self.write("done")


    @gen.coroutine
    def on_chunk(self, chunk):
          self.write(chunk)
          yield self.flush()

请求有时会非常大,客户端可能会在请求仍在获取和发送到客户端的过程中离开。如果发生这种情况,当尝试 self.write() 时,on_chunk 函数中将出现异常。我的问题是,如果我的客户离开了,我该如何中止剩余的下载?

如果您的 streaming_callback 引发异常,则应中止客户端请求。这将使用堆栈跟踪向日志发送垃圾邮件,但目前还没有更干净的方法来做到这一点。您可以覆盖 on_connection_close 以检测客户端何时断开连接,并在 self 上设置一个您可以签入 on_chunk 的属性。