Ответ
Основное различие заключается в том, что корутина — это определение асинхронной операции, а задача (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'>
# Начало...
# ...конец!
# Результат задачи: Готово