在aiohttp中处理过早的客户端断开连接

时间:2017-11-08 08:56:03

标签: python python-asyncio aiohttp

我目前正在测试aiohttp,我遇到以下代码的问题:

async def index(request: web.Request) -> web.StreamResponse:
    response = web.StreamResponse(headers={'content-type': 'text/plain'})
    await response.prepare(request)
    for i in range(1000000):
        try:
            response.write(b'test response')
            await response.drain()
        except concurrent.futures.CancelledError:
            print('Remote connection closed... Cleaning up...')
            # Do cleanup process here?
            raise

    return response

现在我尝试使用以下curl请求:

curl -v http://127.0.0.1:8080

然后我按Ctrl-C导致curl断开连接并停止下载响应。

在aiohttp网络服务器的控制台日志中,我得到以下很多

2017-11-08 14:42:31,295|WARNING|asyncio|socket.send() raised exception.
2017-11-08 14:42:31,295|WARNING|asyncio|socket.send() raised exception.
2017-11-08 14:42:31,295|WARNING|asyncio|socket.send() raised exception.
2017-11-08 14:42:31,295|WARNING|asyncio|socket.send() raised exception.
2017-11-08 14:42:31,295|WARNING|asyncio|socket.send() raised exception.

保持循环,我无法使用Ctrl-C终止服务器。我必须使用kill -KILL将其终止才能完全终止它。似乎无提示地处理客户端套接字断开连接。我想对asyncio.selector_events._SelectorSocketTransport.write()引发的上述警告保持沉默。我可以通过设置适当的记录器级别来保持沉默,但这不是我想要的。此外,当客户端连接终止时,我还想做很多清理过程。我查看了aiohttp代码,似乎没有任何处理程序或信号可以用来处理它。理想情况下,我希望能够在客户端连接关闭时进行一些清理。

在Django中,我可以通过使用SelfCleaningStream类创建自定义StreamingHttpResponse类来完成此操作。自定义SelfCleaningStream类处理close()方法中的清理,当客户端连接关闭时,Django会调用该方法。

1 个答案:

答案 0 :(得分:1)

感谢您的举报。 这是aiohttp中的一个错误,我已经提交了issue