Вопрос:
Я получаю исключение «Cannot write to closing transport» возникшее из aiohttp.http_writer.StreamWriter#_write, но только в некоторых случаях.
Соответствующий фрагмент.
session: aiohttp.ClientSession async with session.get(url, timeout=60) as response: txt = await response.text() response.close() return txt
Что здесь происходит? Я не думаю, что размер сервера закрывает сокет.
Лучший ответ:
Ответ: Мы должны создавать новую сессию по каждому запросу. Также нет необходимости явно закрывать response(), так как менеджер контекста обрабатывает это.
async with aiohttp.ClientSession().get(url, timeout=60) as response: txt = await response.text() return txt Ответ №1
Это означает, что ваше соединение уже закрыто. Это происходит, когда клиент разрывает соединение, но сервер все еще пытается ответить ему.
Удалите response.close() из вашего кода.
Ответ №2
Это происходит, если клиент преждевременно отключается, прежде чем прочитать часть или весь ответ. Вы можете часто сталкиваться с этим случаем, если вы имеете дело с мобильными клиентами (которые могут переключаться между WiFi и мобильными сетями) или если у вас есть просмотры, которые занимают некоторое время, но у клиентов меньше время ожидания. Поскольку вы не можете контролировать, как клиенты разговаривают с вашим сервисом, вероятно, это безопасно игнорировать.
aiohttp 3.6.0 introduces code to slience this exception