龙卷风从 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
的属性。
在其中一个处理程序中,我正在执行以下操作:
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
的属性。