← Назад к вопросам

В чем разница между task и корутиной?

2.0 Middle🔥 111 комментариев
#Python Core#Асинхронность и многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Task и Корутиной в Python asyncio

Это один из самых важных концептов асинхронного программирования в Python. Хотя они связаны, это разные сущности с разными целями.

Корутина (Coroutine)

Корутина — это функция, определённая с помощью async def, которая возвращает объект coroutine. Это специальный объект, который может быть приостановлен и возобновлен.

async def fetch_data():
    """Это корутина"""
    await asyncio.sleep(1)
    return "data"

# Вызов корутины возвращает coroutine объект, но не выполняет её
coro = fetch_data()  # Это объект coroutine, выполнение не началось
print(type(coro))  # <class "coroutine">

Корутина — это просто определение функции, которая может быть приостановлена. Она не выполняется сама по себе, пока её не передать в event loop.

Ключевые характеристики:

  • Возвращается при вызове async def функции
  • Содержит логику, которая должна выполняться асинхронно
  • Может быть приостановлена на точках await
  • Не может быть отменена непосредственно
  • Нужно явно запустить через event loop

Task (Задача)

Task — это обёртка вокруг корутины, которая упаковывает её в Future объект и немедленно начинает выполнение в event loop.

async def fetch_data():
    await asyncio.sleep(1)
    return "data"

# Создание Task из корутины
task = asyncio.create_task(fetch_data())
print(type(task))  # <class "asyncio.tasks.Task">

Ключевые характеристики:

  • Это Future, привязанная к event loop
  • Автоматически начинает выполняться в event loop
  • Может быть отменена через .cancel()
  • Позволяет отслеживать прогресс выполнения
  • Удобна для параллельного выполнения нескольких операций

Практическое сравнение

import asyncio

async def task_func():
    print("Начало выполнения")
    await asyncio.sleep(1)
    print("Конец выполнения")
    return "результат"

async def main():
    # --- Работа с корутиной ---
    coro = task_func()  # Корутина создана, но НЕ выполняется
    # coro начнёт выполняться только если его awaited или передать в event loop
    result = await coro  # Теперь выполняется
    print(f"Результат корутины: {result}")
    
    # --- Работа с Task ---
    task = asyncio.create_task(task_func())  # Task СРАЗУ начинает выполняться
    result = await task  # Ждём завершения
    print(f"Результат task: {result}")
    
    # --- Параллельное выполнение нескольких task ---
    tasks = [
        asyncio.create_task(task_func()),
        asyncio.create_task(task_func()),
        asyncio.create_task(task_func()),
    ]
    results = await asyncio.gather(*tasks)
    print(f"Все результаты: {results}")

asyncio.run(main())

Когда использовать Task

Task полезна когда:

# 1. Параллельное выполнение нескольких операций
async def fetch_multiple():
    tasks = [
        asyncio.create_task(fetch_user(1)),
        asyncio.create_task(fetch_user(2)),
        asyncio.create_task(fetch_user(3)),
    ]
    users = await asyncio.gather(*tasks)
    return users

# 2. Отмена выполнения
async def with_timeout():
    task = asyncio.create_task(long_operation())
    try:
        await asyncio.wait_for(task, timeout=5.0)
    except asyncio.TimeoutError:
        task.cancel()  # Отменяем Task, если превышен timeout

# 3. Отслеживание статуса выполнения
async def check_status():
    task = asyncio.create_task(some_work())
    if task.done():  # Проверяем, завершена ли Task
        print("Готово")
    else:
        print("Ещё выполняется")

Главная разница

АспектКорутинаTask
Что этоРезультат вызова async defОбёртка над корутиной в Future
Начало выполненияТолько при await или передаче в loopСразу при создании
ОтменаНельзя напрямуюЧерез .cancel()
ИспользованиеДля определения асинхронных функцийДля планирования и управления выполнением
ПараллелизмНужно явно управлятьВстроенная поддержка

Простое правило: Корутина — это определение, Task — это выполнение. Если вы хотите параллельное выполнение нескольких операций или контролировать отмену, используйте Task через asyncio.create_task().

В чем разница между task и корутиной? | PrepBro