我有一个长时间运行的请求,在此期间我将数据推送到客户端,因为它已收到。但是,该请求需要一些服务器端创建的资源,我希望在客户端断开连接时进行清理。我查看了文档,但我似乎无法找到检测何时发生的方法。有什么想法吗?
答案 0 :(得分:3)
查看文档并不是非常明显,但关键是当连接关闭时,asyncio服务器会将CancelledError
抛出到处理程序协程中。无论在哪里等待异步操作完成,都可以捕获CancelledError
。
使用这个,我在连接之后进行清理:
async def passthrough_data_until_disconnect():
await create_resources()
while True:
try:
await get_next_data_item()
except (concurrent.futures.CancelledError,
aiohttp.ClientDisconnectedError):
# The request has been cancelled, due to a disconnect
await do_cleanup()
# Re-raise the cancellation error so the handler
# task gets cancelled for real
raise
else:
await write_data_to_client_response()