Что такое Event Loop в Python

Python Middle Без компании
Что такое Event Loop в Python
Ответы
**Event Loop** (цикл событий) в Python — это фундаментальный механизм библиотеки `asyncio`, который координирует выполнение асинхронного кода, обработку событий и управление задачами. Он позволяет организовать **неблокирующую параллельность** в рамках одного потока. **Зачем нужен Event Loop?** **- Однопоточная асинхронность**: Запуск множества I/O-операций (сеть, файлы) без создания потоков. **- Эффективность**: Избегает затрат на переключение контекста между потоками. **- Управление задачами**: Планирует выполнение корутин (coroutines) и callback-ов. **Как работает?** **Бесконечный цикл**, который: - Отслеживает события (например, готовность данных в сокете). - Выполняет готовые к работе корутины. - Переключается между задачами при возникновении `await`. *Пример работы:* ``` import asyncio async def task1(): print("Начало task1") await asyncio.sleep(1) # Неблокирующее ожидание print("Конец task1") async def task2(): print("Начало task2") await asyncio.sleep(2) print("Конец task2") async def main(): await asyncio.gather(task1(), task2()) # Запуск задач параллельно # Запуск event loop asyncio.run(main()) ``` *Вывод:* ``` Начало task1 Начало task2 (через 1 сек) Конец task1 (через 2 сек) Конец task2 ``` ### **Ключевые понятия:** **- Корутины (coroutines)**: Функции, объявленные через `async def`, которые могут приостанавливаться (`await`). **- Задачи (Tasks)**: Обертки вокруг корутин, планируемые в event loop. **- Future**: Объект, представляющий результат асинхронной операции. **Этапы работы Event Loop:** **- Запуск** через `asyncio.run()`. **- Планирование задач** (например, `create_task`). **- Ожидание событий** (I/O, таймеры). **- Вызов callback-ов** или возобновление корутин. **- Завершение** после выполнения всех задач. ### **Что происходит при** `await`**?** 1. Корутина приостанавливается и отдает управление обратно в event loop. 2. Event loop проверяет другие готовые задачи. 3. Когда ожидаемая операция завершается (например, данные получены), корутина возобновляется. **Важно:** - Event Loop работает в **одном потоке** (GIL не мешает, так как нет параллельных вычислений CPU). - Для CPU-интенсивных задач лучше использовать многопроцессорность (`multiprocessing`).