我目前正在测试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会调用该方法。