检测客户端何时从aiohttp请求处理程序关闭连接

时间:2016-03-29 03:37:56

标签: python-asyncio aiohttp

我有一个长时间运行的请求,在此期间我将数据推送到客户端,因为它已收到。但是,该请求需要一些服务器端创建的资源,我希望在客户端断开连接时进行清理。我查看了文档,但我似乎无法找到检测何时发生的方法。有什么想法吗?

1 个答案:

答案 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()