Сколько корутин можно сделать одновременно?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Количество корутин в Python asyncio
Корутины в Python асинхронном программировании не имеют жёсткого лимита на количество. Теоретически можно создать миллионы корутин, однако это ограничено памятью и системными ресурсами.
Как создаются корутины
Корутины — это функции, определённые с помощью async def. Они не выполняются сразу, а создают объект корутины:
import asyncio
async def task(name):
print(f"Start {name}")
await asyncio.sleep(1)
print(f"End {name}")
# Можно создавать их в цикле
coroutines = [task(f"task-{i}") for i in range(1000)]
Запуск нескольких корутин одновременно
Для запуска множества корутин используется asyncio.gather() или asyncio.create_task():
async def main():
# Запустить 1000 корутин одновременно
await asyncio.gather(*[task(f"task-{i}") for i in range(1000)])
asyncio.run(main())
Ограничения на практике
Хотя количество корутин не ограничено, есть факторы:
- Память — каждая корутина занимает память. На ПК с 8GB можно запустить 100K-1M корутин
- Дескрипторы файлов — если корутины открывают файлы или сокеты
- Таймауты и задержки — много долгих операций замораживают поток
import asyncio
async def main():
tasks = [asyncio.create_task(task(i)) for i in range(10000)]
await asyncio.gather(*tasks)
asyncio.run(main())
Практический пример с ограничением
Для избежания проблем часто используют Semaphore для ограничения параллельности:
async def limited_task(semaphore, name):
async with semaphore:
print(f"Running {name}")
await asyncio.sleep(1)
print(f"Done {name}")
async def main():
semaphore = asyncio.Semaphore(10) # Максимум 10 параллельных
tasks = [limited_task(semaphore, i) for i in range(1000)]
await asyncio.gather(*tasks)
asyncio.run(main())
Различие между корутинами и задачами
Корутина — это объект, Task — это обёртка над корутиной для запуска:
async def my_coro():
await asyncio.sleep(1)
return "done"
# Это корутина (не запущена)
coro = my_coro()
# Это задача (запущена в event loop)
task = asyncio.create_task(my_coro())
Event loop и одновременность
Event loop — один поток, который чередует выполнение корутин. "Одновременность" — это не параллелизм, а переключение контекста:
async def main():
# Все 100 корутин запущены в одном потоке
# но выполняются как будто параллельно
await asyncio.gather(*[task(i) for i in range(100)])
Заключение
Сколько корутин можно создать? — Практически неограниченно, но в пределах памяти системы (обычно 10K-1M). На практике используют Semaphore для контроля параллельности и избежания перегрузки ресурсов.