Вопрос проверяет понимание асинхронного выполнения кода в Python, в частности механизма событийного цикла, который позволяет обрабатывать несколько задач конкурентно без многопоточности.
Событийный цикл (event loop) — это механизм, который бесконечно выполняет и планирует асинхронные задачи (корутины) в одном потоке. В Python он реализован в модуле asyncio. Основная идея: вместо того чтобы ждать завершения операции ввода-вывода (например, чтения файла или сетевого запроса), корутина приостанавливается, и цикл переключается на другую задачу. Когда операция завершается, цикл возобновляет корутину.
Событийный цикл хранит очередь задач. Он берет задачу, выполняет её до первого оператора await, затем приостанавливает и переходит к следующей. Когда приходит уведомление о завершении ожидаемой операции (например, от сокета), задача снова помещается в очередь на выполнение. Это напоминает кооперативную многозадачность: корутины сами отдают управление.
import asyncio
async def fetch_data(url):
print(f"Загрузка {url}")
await asyncio.sleep(1) # имитация задержки
print(f"Загружено {url}")
return f"Данные из {url}"
async def main():
tasks = [
fetch_data("site1.com"),
fetch_data("site2.com"),
fetch_data("site3.com")
]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())В этом примере три корутины запускаются одновременно. Каждая приостанавливается на await asyncio.sleep(1), и цикл переключается между ними. В результате все три загрузки завершаются примерно за 1 секунду, а не за 3.
Событийный цикл идеален для I/O-bound задач: веб-серверы (aiohttp, FastAPI), сетевые клиенты, чат-приложения, обработка большого количества соединений. Он не подходит для CPU-bound задач (вычисления), так как работает в одном потоке — для этого лучше использовать multiprocessing.
Вывод: Событийный цикл в Python — ключевой инструмент для создания высокопроизводительных асинхронных приложений, работающих с сетью или файлами. Он позволяет обрабатывать тысячи соединений в одном потоке, экономя ресурсы и упрощая код.
Уровень
Рейтинг:
4
Сложность:
5
Навыки
Python
Node.js
Ключевые слова
Подпишись на Python Developer в телеграм