В чём разница между Coroutine, Task и Future в asyncio?
Ответ от нейросети
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 — объект, представляющий результат асинхронной операции.