Event loop
Цикл событий управляет набором задач и решает, какую продолжить, когда другая ждёт. Пользователь обычно запускает верхнюю корутину через asyncio.run. Дальше цикл событий отслеживает готовность операций и возвращает управление нужной задаче.
Корутины и await
Функция async def возвращает объект корутины. Чтобы выполнить ожидаемую асинхронную операцию, используют await. В этот момент текущая корутина может приостановиться, а event loop займётся другой задачей. Если внутри async-функции вызвать обычную долгую блокирующую функцию, всё преимущество исчезает.
Параллельное ожидание
Несколько корутин можно запустить конкурентно через задачи или asyncio.gather. Например, десять сетевых запросов не обязаны выполняться строго один за другим. При этом конкурентность не равна параллельности на нескольких ядрах: большая часть AsyncIO работает в одном потоке, быстро переключаясь между ожиданиями.
Отмена и ошибки
Асинхронный код должен уметь корректно обрабатывать исключения и отмену задач. Если одна корутина падает, важно понимать, что произойдёт с остальными. Тайм-ауты тоже критичны: сетевой запрос не должен ждать бесконечно. Чем больше задач, тем важнее явное управление их жизненным циклом.
Попробуйте на практике
Сравнить последовательное и конкурентное ожидание.
- Создайте async-функцию с asyncio.sleep(1).
- Вызовите её три раза последовательно.
- Измерьте время выполнения.
- Запустите три вызова через asyncio.gather.
- Сравните время и объясните разницу.
Как проверить результат. Упражнение выполнено, если конкурентная версия завершается примерно за время одного ожидания, а не сумму трёх.
Частые вопросы
AsyncIO ускоряет вычисления на CPU?
Обычно нет. Для CPU-тяжёлых задач нужны другие подходы, например процессы.
Можно ли использовать обычные библиотеки внутри async-кода?
Можно, но блокирующие операции остановят event loop на время выполнения.
Когда AsyncIO особенно полезен?
При большом количестве сетевых или других операций ожидания.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.