Я создаю долго работающую фоновую службу на Python с использованием asyncio, и я столкнулся с проблемой использования памяти, которая со временем становится все более серьезной. Служба планирует несколько асинхронных задач каждые несколько секунд, обрабатывает некоторую работу, связанную с вводом-выводом, а затем должна освободить память после завершения задач. Однако после нескольких часов работы использование оперативной памяти стабильно увеличивается и никогда не снижается, даже если задачи завершаются правильно.
Я подозреваю, что проблема может быть связана с тем, как я храню ссылки на задачи или обратные вызовы, но не могу точно определить, что я делаю неправильно. Я уже пробовал принудительно собирать мусор и отслеживать объекты с помощью Tracemalloc, но результаты сбивают с толку. Ниже приведена упрощенная версия моего кода, демонстрирующая структуру, которую я использую:
Код: Выделить всё
import asyncio
tasks = []
async def worker(n):
await asyncio.sleep(1)
return n * 2
async def scheduler():
while True:
task = asyncio.create_task(worker(10))
tasks.append(task)
await asyncio.sleep(0.5)
async def main():
await scheduler()
asyncio.run(main())
Даже когда задачи выполнены, память продолжает увеличиваться. Каков правильный шаблон управления задачами asyncio в долго работающем приложении, чтобы избежать утечек памяти? Должен ли я ожидать или очищать задачи по-другому, или есть лучший подход к проектированию для такого рода рабочей нагрузки?
Подробнее здесь:
https://stackoverflow.com/questions/798 ... ning-servi