@cascado

Почему при запуске с помощью asyncio корутин, даже при их корректном завершении они остаются в памяти?

Добрый день. Суть вопроса:
используется ограниченный пул корутин, при заполнении ожидается с помощью вот такой конструкции:
done, pending = await asyncio.wait(pool, return_when=asyncio.FIRST_COMPLETED)
При этом если постоянно выводить количество всех тасков в памяти с помощью asyncio.Task.all_tasks(loop), то оно постоянно растет, т.е. даже завершенные таски я удаляю из пула, но они висят в памяти. Когда их становится больше 940, я начинаю получать эксепшены вида "MemoryError. Fatal read error on socket transport...". Я полагаю, что проблема в кривой работе с aiohttp.get, но конкретно.. Что с ними или со мной не так? Код прилагаю. https://gist.github.com/anonymous/3b4b4e2357c75de0...
  • Вопрос задан
  • 440 просмотров
Решения вопроса 1
@cascado Автор вопроса
В общем, схема работы у event machine такова, что выполненные таски будут выкинуты на мороз при следущем удобном случае, и совершенно необязательно будут удалены сразу. Было протестировано пару сценариев, при спавне большого количества тасков реактор начинает шустрее отбрасывать лишнее. Ошибка по памяти была получена в результате недосмотра маленького, но неприятного бага.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы