Какие типы awaitable-объектов существуют в Python asyncio?

«Какие типы awaitable-объектов существуют в Python asyncio?» — вопрос из категории Асинхронность, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

awaitable-объект в asyncio — это любой объект, который можно использовать в выражении await. Существует три основных типа:

  1. Корутина (Coroutine) Это результат вызова асинхронной функции, определенной через async def. Сама по себе корутина ничего не выполняет, пока ее не запустят с помощью await или не обернут в Task.

    import asyncio
    
    async def my_coroutine():
        print("Coroutine is running")
        return 42
    
    # my_coroutine() создает объект корутины, но не выполняет код внутри
    coro = my_coroutine()
    # await запускает выполнение
    result = await coro
  2. Задача (Task) Это объект, который планирует выполнение корутины в цикле событий asyncio. Задачи позволяют запускать корутины конкурентно (параллельно). Создаются с помощью asyncio.create_task().

    task = asyncio.create_task(my_coroutine())
    # Можно выполнять другие действия, пока task работает в фоне
    await task
  3. Объект Future Низкоуровневый awaitable-объект, представляющий конечный результат асинхронной операции. Обычно используется не в прикладном коде, а разработчиками библиотек для управления состоянием операций (ожидание, завершение, ошибка).

Ключевое различие: корутины — это "рецепты" асинхронных операций, а Task — это то, что запускает их выполнение в цикле событий.