Ответ
asyncio.Task
— это объект, который планирует и управляет выполнением асинхронной функции (корутины) в цикле событий. Он позволяет запускать корутины конкурентно, не дожидаясь завершения одной, чтобы начать другую.
Ключевое отличие от прямого await
:
await my_coro()
: Последовательное выполнение. Программа остановится и будет ждать завершенияmy_coro()
, прежде чем перейти к следующей строке кода.task = asyncio.create_task(my_coro())
: Конкурентный запуск. Корутинаmy_coro()
планируется для выполнения в фоновом режиме, а программа немедленно продолжает свою работу.task
можно использовать позже, чтобы дождаться результата.
Как создать Task:
Основной способ — использовать функцию asyncio.create_task()
.
Практический пример (конкурентное выполнение):
В этом примере две задачи запускаются практически одновременно и выполняются параллельно, а не одна за другой.
import asyncio
import time
async def say_after(delay, text):
await asyncio.sleep(delay)
print(text)
async def main():
start_time = time.time()
print(f"Начало выполнения в {time.strftime('%X')}")
# Создаем и запускаем две задачи конкурентно
task1 = asyncio.create_task(
say_after(1, 'Hello')
)
task2 = asyncio.create_task(
say_after(2, 'World')
)
# Ждем завершения обеих задач
await task1
await task2
# Альтернативный способ дождаться всех задач: await asyncio.gather(task1, task2)
end_time = time.time()
print(f"Завершено в {time.strftime('%X')}")
print(f"Общее время выполнения: {end_time - start_time:.2f} секунд")
asyncio.run(main())
# Вывод:
# Начало выполнения в 14:30:00
# Hello
# World
# Завершено в 14:30:02
# Общее время выполнения: 2.01 секунд (а не 1+2=3)