Вопрос проверяет понимание принципов асинхронной модели Python: событийный цикл, корутины, задачи и неблокирующие операции.
asyncio работает на основе одного потока и цикла событий, который переключается между задачами, когда те ожидают ввода-вывода. Корутину можно приостановить командой await, позволяя циклу выполнять другие задачи, пока текущая ждёт ответа от сети или файла. Такая модель эффективна для большого количества I/O-операций. Задачи (asyncio.Task) планируются циклом событий, который управляет их состояниями. В итоге мы получаем параллелизм без потоков и без проблем GIL.
Асинхронная модель asyncio — это реализация кооперативной многозадачности.
Определение:
Корутиной называется функция, определённая как async def, которую можно приостанавливать с помощью await.
корутина выполняет полезную работу до момента ожидания;
затем она «замораживается», а управление возвращается циклу событий.
Определение:
Event loop — центральный механизм, который:
хранит задачи;
знает, какие задачи готовы к продолжению;
«переключается» между ними;
вызывает колбэки по мере завершения операций.
Корутину можно обернуть в объект Task, чтобы позволить ей выполняться параллельно с другими.
Python
import asyncio
async def fetch():
await asyncio.sleep(1)
return "OK"
async def main():
task = asyncio.create_task(fetch())
result = await task
print(result)
asyncio.run(main())
asyncio пошаговоПрограмма запускает event loop.
В loop помещаются задачи.
Когда корутина вызывает await:
она отдаёт управление циклу;
цикл смотрит, какие задачи готовы продолжить выполнение;
выбирает следующую задачу и запускает её.
Если задача ждёт I/O (сетевой запрос, sleep, чтение файла):
она не блокирует поток;
event loop получает уведомление по завершении операции;
задача возвращается в очередь готовых.
нет переключения потоков;
минимальные накладные расходы;
тысячи одновременных соединений легко обслуживаются одним потоком;
GIL перестаёт быть проблемой, потому что нет конкуренции между потоками.
Это ключевой подход для high-load сетевых сервисов.
Иногда нужно выполнять тяжёлую CPU-задачу. Тогда применяют:
ThreadPoolExecutor — для лёгких CPU-задач или блокирующих I/O;
ProcessPoolExecutor — для тяжёлых задач, обходя GIL.
asyncio — это механизм кооперативной многозадачности, в котором цикл событий управляет выполнением корутин, переключаясь между ними при ожидании I/O. Эффективен для сетевых и высоконагруженных приложений.