← Назад к вопросам

Сколько корутин можно сделать одновременно?

2.3 Middle🔥 101 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Количество корутин в 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())

Ограничения на практике

Хотя количество корутин не ограничено, есть факторы:

  1. Память — каждая корутина занимает память. На ПК с 8GB можно запустить 100K-1M корутин
  2. Дескрипторы файлов — если корутины открывают файлы или сокеты
  3. Таймауты и задержки — много долгих операций замораживают поток
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 для контроля параллельности и избежания перегрузки ресурсов.

Сколько корутин можно сделать одновременно? | PrepBro