Что представляет собой объект Task в asyncio и как его создать

Ответ

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)