У меня есть длинный запрос, в течение которого я отправляю данные до клиента по мере его получения. Однако для запроса требуются некоторые ресурсы, которые создаются на стороне сервера, которые я бы хотел очистить, когда клиент отключается. Я просмотрел документы, но я не могу найти способ обнаружить, когда это произойдет. Есть идеи?Обнаруживать, когда клиент закрывает соединение с обработчиком запросов aiohttp
4
A
ответ
3
Это не очень очевидно, глядя на документы, но ключ здесь заключается в том, что асинхронный сервер будет бросать 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()
Вы должны поймать как '' asyncio.CancelledError' и aiohttp.ClientDisconnectedError' –
О, я не знал о том, что один ; Я уточню свой ответ. Благодаря! –
Где я могу это использовать? Я в значительной степени не понимаю. – Goodies