asyncio.sleep — coroutine или Future?

asyncio.sleep — coroutine или Future?

@python_quiz

Разберем этот квиз

Короткий ответ: вызов asyncio.sleep() без await/Task возвращает объект-корутины, а не Future. Чтобы выполнение было запланировано и стало Future-подобным, корутину нужно обернуть в Task (через asyncio.create_task/ensure_future или запустить через loop).

Ниже — разбор с демонстрациями и анализом вариантов.

Быстрая демонстрация (тот же код, что в квизе)

python

Объяснение вывода: asyncio.sleep — асинхронная функция (async def), вызов возвращает объект корутины. Этот объект не является Future; он просто описывает отложенную работу.

Что происходит, если обернуть корутину в Task

Task — объект, который планирует выполнение корутины в loop и наследует поведение Future (можно ждать, проверять состояние, получать результат). Пример:

python

Ожидаемый вывод (пример):

Как видно, Task — это экземпляр asyncio.Task и одновременно рассматривается как asyncio.Future (Task наследует Future).

Альтернативы: ensure_future и await

  • asyncio.ensure_future(coro) также принимает корутину и возвращает Task (если передали корутину) или просто возвращает переданный Future.
  • await coro выполнит корутину и вернёт результат, но сам корутинный объект не станет Future — он исполняется в контексте, где loop создает и управляет Task за вас (внутри asyncio.run/await).

Пример ensure_future:

python

Кратко о различиях: coroutine vs Future vs Task

  • Coroutine (объект корутины) — результат вызова async-функции. Это "описание" работы, которое нужно выполнить.
  • Future — контейнер/место для результата асинхронной операции; можно ждать завершения, установить результат извне.
  • Task — специальный Future, который запускает корутину в event loop; Task наследует Future.

Проверки, которые полезно знать:

  • isinstance(coro_obj, asyncio.Future) — обычно False для сырых корутин.
  • isinstance(task_obj, asyncio.Future) — True для Task.
  • issubclass(asyncio.Task, asyncio.Future) — True (Task — подкласс Future).
python

Анализ вариантов (логика проверки)

  • Вариант с типом, похожим на "<class 'coroutine'> False" соответствует поведению: корутина и не Future.
  • Варианты, утверждающие, что вызов возвращает asyncio.Future или asyncio.Task, некорректны без явного создания Task/обёртки.
  • Утверждение, что корутина — экземпляр asyncio.Task, неправильно: Task создаётся отдельно через create_task/ensure_future.

Итог

asyncio.sleep() при вызове (без await или обёртки) возвращает объект корутины, а не Future. Чтобы получить объект Future/Task, нужно явно запланировать корутину в loop (create_task/ensure_future) или выполнить её через await в асинхронной среде.

Report Page