我目前正在测试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请求来尝试一下:
^{pr2}$然后我按Ctrl-C,让curl断开连接并停止下载响应。在
在aiohttp web服务器的控制台日志中,我得到了以下许多信息:
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中,我可以通过使用StreamingHttpResponse
类创建一个自定义的SelfCleaningStream
类来实现这一点。自定义的SelfCleaningStream
类处理close()
方法中的清理,该方法在客户端连接关闭时由Django调用。在
谢谢你的报告。 这是aiohttp中的一个bug,我已经提交了一个issue
相关问题 更多 >
编程相关推荐