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().