Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Python: event, loop, task

Объясните, как работает asyncio в Python.

Вопрос проверяет понимание принципов асинхронной модели Python: событийный цикл, корутины, задачи и неблокирующие операции.

Короткий ответ

asyncio работает на основе одного потока и цикла событий, который переключается между задачами, когда те ожидают ввода-вывода. Корутину можно приостановить командой await, позволяя циклу выполнять другие задачи, пока текущая ждёт ответа от сети или файла. Такая модель эффективна для большого количества I/O-операций. Задачи (asyncio.Task) планируются циклом событий, который управляет их состояниями. В итоге мы получаем параллелизм без потоков и без проблем GIL.

Длинный ответ

Асинхронная модель asyncio — это реализация кооперативной многозадачности.

1. Основные понятия

1.1. Корутинa

Определение:
Корутиной называется функция, определённая как async def, которую можно приостанавливать с помощью await.

  • корутина выполняет полезную работу до момента ожидания;

  • затем она «замораживается», а управление возвращается циклу событий.

1.2. Цикл событий (event loop)

Определение:
Event loop — центральный механизм, который:

  • хранит задачи;

  • знает, какие задачи готовы к продолжению;

  • «переключается» между ними;

  • вызывает колбэки по мере завершения операций.

1.3. Задачи (Task)

Корутину можно обернуть в объект Task, чтобы позволить ей выполняться параллельно с другими.

Python

import asyncio

async def fetch():
    await asyncio.sleep(1)
    return "OK"

async def main():
    task = asyncio.create_task(fetch())
    result = await task
    print(result)

asyncio.run(main())

2. Как работает asyncio пошагово

  1. Программа запускает event loop.

  2. В loop помещаются задачи.

  3. Когда корутина вызывает await:

    • она отдаёт управление циклу;

    • цикл смотрит, какие задачи готовы продолжить выполнение;

    • выбирает следующую задачу и запускает её.

  4. Если задача ждёт I/O (сетевой запрос, sleep, чтение файла):

    • она не блокирует поток;

    • event loop получает уведомление по завершении операции;

    • задача возвращается в очередь готовых.

3. Почему это эффективно

  • нет переключения потоков;

  • минимальные накладные расходы;

  • тысячи одновременных соединений легко обслуживаются одним потоком;

  • GIL перестаёт быть проблемой, потому что нет конкуренции между потоками.

Это ключевой подход для high-load сетевых сервисов.

4. Взаимодействие с синхронным кодом

Иногда нужно выполнять тяжёлую CPU-задачу. Тогда применяют:

  • ThreadPoolExecutor — для лёгких CPU-задач или блокирующих I/O;

  • ProcessPoolExecutor — для тяжёлых задач, обходя GIL.

5. Вывод

asyncio — это механизм кооперативной многозадачности, в котором цикл событий управляет выполнением корутин, переключаясь между ними при ожидании I/O. Эффективен для сетевых и высоконагруженных приложений.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Python

    Python

Ключевые слова

#event

#loop

#task

Подпишись на Python Developer в телеграм