Короткий ответ
Модуль asyncio даёт инструменты асинхронного программирования: он позволяет выполнять I/O-bound задачи, не блокируя основной поток. Программа регистрирует корутины и продолжает работать, пока идёт ожидание сети, диска или базы данных.
Как это работает подробнее
В основе asyncio лежит цикл событий, который следит за готовностью корутин и переключает выполнение в точках await.
- Цикл событий. Управляет корутинами: когда корутина делает await, цикл переключается на другие готовые задачи.
- Корутины. Создаются ключевым словом async def, а запускаются через await внутри другой корутины либо через asyncio.run().
- Ожидание. asyncio.sleep() приостанавливает корутину и возвращает управление циклу, поэтому десятки и сотни таких корутин работают за одно и то же время.
- Назначение. Асинхронность выгодна приложениям со множеством одновременных соединений: веб-серверам и клиентам внешних API.
Пример кода
Простая асинхронная корутина
import asyncio
async def say_hello():
await asyncio.sleep(1)
print('Hello!')
asyncio.run(say_hello())Что использовать на практике
- Серверы и API. Используй asyncio там, где нужны тысячи одновременных соединений.
- I/O-bound сценарии. Подходит для множества запросов к базам данных, файлам и внешним сервисам.
- Точка входа. Запускай асинхронную программу через asyncio.run(), а не созданием цикла вручную.
Подводные камни
- Вычисления. asyncio не ускоряет CPU-bound код: выигрыш даёт только конкурентный ввод-вывод.
- Блокирующие вызовы. Синхронная операция внутри корутины останавливает весь цикл событий.
- Забытый запуск. Простой вызов async-функции не выполнит её тело: нужен await или asyncio.run().
Как отвечать на собеседовании
- Определи цель модуля: неблокирующее выполнение I/O-bound задач → объясни цикл событий и переключение в точках await → приведи пример с asyncio.sleep() → добавь, что asyncio ускоряет ожидание, а не вычисления.