Что такое 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`).