Sobes.tech
Back to questions
Middle
2

В чём разница между Coroutine, Task и Future в asyncio?

Companies where asked
aic

Answer from AI

sobes.tech AI

В asyncio в Python есть три ключевых понятия, которые часто путают: Coroutine, Task и Future.

  • Coroutine — это функция, объявленная с помощью async def, которая при вызове возвращает корутину (корутинный объект). Она описывает асинхронную операцию, но сама по себе не запускается автоматически. Чтобы выполнить корутину, её нужно либо await, либо запустить через event loop.

  • Task — это обёртка над корутиной, которая планирует её выполнение в event loop. Создаётся с помощью asyncio.create_task(coroutine) или loop.create_task(coroutine). Task запускает корутину и позволяет отслеживать её состояние и результат. По сути, Task — это Future, который выполняет корутину.

  • Future — это низкоуровневый объект, представляющий результат асинхронной операции, который ещё не готов. Future можно вручную создавать и завершать, устанавливая результат или исключение. Task наследуется от Future, но предназначен для запуска корутин.

Пример:

import asyncio

async def coro():
    await asyncio.sleep(1)
    return 'result'

async def main():
    # Coroutine
    c = coro()

    # Task — запускает coroutine
    t = asyncio.create_task(c)

    # Task — это Future
    print(isinstance(t, asyncio.Future))  # True

    result = await t
    print(result)

asyncio.run(main())

Итого:

  • Coroutine — описание асинхронной работы.
  • Task — объект, который запускает coroutine и является Future.
  • Future — объект, представляющий результат асинхронной операции.