Ответ
Event Loop (цикл событий) — это ядро любой асинхронной программы на asyncio
, которое управляет выполнением корутин (асинхронных функций).
Его основная задача — запускать задачи, приостанавливать их на время ожидания операций ввода-вывода (I/O) и возобновлять, когда операция завершена, не блокируя при этом основной поток.
Принцип работы по шагам:
- Очередь задач: Все асинхронные задачи (корутины) помещаются в очередь.
- Выполнение: Event Loop берет первую задачу из очереди и выполняет ее код.
- Ожидание: Если задача встречает
await
на долгой операции (например,asyncio.sleep(1)
или сетевой запрос), ее выполнение приостанавливается, а управление возвращается циклу. - Переключение: Цикл не ждет завершения операции, а сразу берет следующую задачу из очереди и начинает ее выполнять.
- Возобновление: Когда ожидаемая операция ввода-вывода завершается, Event Loop получает уведомление и возвращает приостановленную задачу обратно в очередь для дальнейшего выполнения.
Пример:
import asyncio
import time
async def say_after(delay, what):
await asyncio.sleep(delay) # Приостановка корутины, передача управления
print(what)
async def main():
start = time.time()
# Задачи запускаются конкурентно, а не последовательно
await asyncio.gather(
say_after(1, 'hello'),
say_after(2, 'world')
)
end = time.time()
print(f"Finished in {end - start:.2f} seconds")
# Запуск event loop и выполнение главной корутины
asyncio.run(main())
Вывод:
hello
world
Finished in 2.00 seconds
Этот механизм позволяет эффективно обрабатывать тысячи одновременных I/O-bound операций в одном потоке, избегая накладных расходов на создание и переключение системных потоков.