Чем отличается корутина от задачи (task) в Python asyncio

Ответ

Основное различие заключается в том, что корутина — это определение асинхронной операции, а задача (Task) — это её запущенный на выполнение экземпляр в цикле событий.

  • Корутина (Coroutine): Объект, создаваемый при вызове функции async def. Сама по себе корутина ничего не делает, пока её не запустят с помощью await или не обернут в Task.
  • Задача (Task): Объект, который планирует выполнение корутины в цикле событий (event loop) как можно скорее. Задачи выполняются конкурентно.

Ключевые отличия:

  • Выполнение: Корутина — это "рецепт". Task — это уже запущенный "процесс" по этому рецепту.
  • Управление: Task управляется циклом событий, его можно отменить или проверить его состояние (завершен, ожидает). Корутину нужно явно запустить.
  • Создание: Задачи создаются с помощью asyncio.create_task().

Пример:

import asyncio

async def say_hello():
    print("Начало...")
    await asyncio.sleep(1)
    print("...конец!")
    return "Готово"

async def main():
    # 1. Просто создаем объект корутины. Ничего не происходит.
    coro = say_hello()
    print(f"Тип coro: {type(coro)}")

    # 2. Создаем Task. Корутина немедленно планируется к выполнению в цикле событий.
    print("Создаем задачу...")
    task = asyncio.create_task(say_hello())
    print(f"Тип task: {type(task)}")

    # Ждем завершения задачи и получаем результат
    result = await task
    print(f"Результат задачи: {result}")

asyncio.run(main())

# Вывод:
# Тип coro: <class 'coroutine'>
# Создаем задачу...
# Тип task: <class '_asyncio.Task'>
# Начало...
# ...конец!
# Результат задачи: Готово