Каков принцип работы Event Loop в Python

Ответ

Event Loop (цикл событий) — это ядро любой асинхронной программы на asyncio, которое управляет выполнением корутин (асинхронных функций).

Его основная задача — запускать задачи, приостанавливать их на время ожидания операций ввода-вывода (I/O) и возобновлять, когда операция завершена, не блокируя при этом основной поток.

Принцип работы по шагам:

  1. Очередь задач: Все асинхронные задачи (корутины) помещаются в очередь.
  2. Выполнение: Event Loop берет первую задачу из очереди и выполняет ее код.
  3. Ожидание: Если задача встречает await на долгой операции (например, asyncio.sleep(1) или сетевой запрос), ее выполнение приостанавливается, а управление возвращается циклу.
  4. Переключение: Цикл не ждет завершения операции, а сразу берет следующую задачу из очереди и начинает ее выполнять.
  5. Возобновление: Когда ожидаемая операция ввода-вывода завершается, 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 операций в одном потоке, избегая накладных расходов на создание и переключение системных потоков.