EventLoop
(цикл событий) - это центральный механизм асинхронного программирования в Python (особенно в asyncio
). Он отвечает за выполнение задач, которые могут выполняться параллельно, не блокируя основной поток.
Как используется:
EventLoop
отслеживает события (например, завершение операций ввода-вывода, таймеры) и вызывает соответствующие callback-функции.
EventLoop
(цикл событий) в Python - это сердце асинхронного программирования, особенно при использовании модуля asyncio
. Это бесконечный цикл, который отслеживает и обрабатывает события (например, завершение операций ввода-вывода, таймеры, сигналы). Он выступает в роли координатора, организуя выполнение задач (coroutines) в неблокирующем режиме.
Как он работает:
async
) регистрируются в EventLoop
. Регистрация часто осуществляется через asyncio.create_task()
или asyncio.run()
.
EventLoop
опрашивает операционную систему или другие источники на предмет возникновения событий. События могут быть чтение данных из сокета, истечение таймера, и т.д.
EventLoop
выбирает соответствующую задачу, которая ждала этого события. Он определяет, какая задача может быть выполнена далее на основе готовности её данных или условий.
EventLoop
запускает выбранную задачу. Асинхронные задачи выполняются кооперативно, то есть они сами должны передавать управление обратно в EventLoop
, когда ожидают ввода-вывода или другие медленные операции. Обычно это делается с помощью ключевого слова await
. await
позволяет задаче приостановиться и отдать управление EventLoop
, чтобы он мог обработать другие события.
Ключевые моменты:
EventLoop
обеспечивает параллельность, но не параллелизм в строгом смысле. Он позволяет одному потоку эффективно обрабатывать множество задач, переключаясь между ними, когда одна задача ожидает.
EventLoop
значительно повышает производительность ввода-вывода-связанных операций, таких как сетевые запросы, чтение/запись файлов, поскольку не блокирует поток исполнения.
asyncio
.
EventLoop
на поток.
asyncio.run(main())
автоматически создаёт, запускает и закрывает EventLoop
, что упрощает работу с асинхронным кодом.
Пример:
import asyncio
async def my_coroutine(delay):
print(f"Начало задачи, ждём {delay} секунд")
await asyncio.sleep(delay)
print(f"Задача завершена после {delay} секунд")
return f"Результат {delay}"
async def main():
task1 = asyncio.create_task(my_coroutine(2))
task2 = asyncio.create_task(my_coroutine(1))
result1 = await task1
result2 = await task2
print(f"Результат задачи 1: {result1}")
print(f"Результат задачи 2: {result2}")
asyncio.run(main())
В этом примере, asyncio.run(main())
создает и запускает EventLoop
. main()
создает две задачи, которые выполняются "параллельно" (на самом деле, кооперативно с помощью EventLoop
), позволяя программе не блокироваться во время ожидания завершения asyncio.sleep()
.