Класс Task

Модуль 1: Python Core
14 уровень , 6 лекция
Открыта

7.1 Создание задач

Класс Task в модуле asyncio используется для управления выполнением корутин. Задачи (Tasks) представляют собой обёртки для корутин, позволяющие управлять их выполнением и отслеживать их состояние. Класс Task позволяет запускать корутины параллельно, управляя ими через цикл событий.

Основные методы класса Task

Класс Task — это некоторая обёртка над корутиной, которая даёт такие дополнительные возможности:

Управление выполнением корутин:

Задачи позволяют легко управлять выполнением корутин, контролировать их состояние и получать результаты.

Отмена задач:

Возможность отмены задач делает Task полезным для управления длительными операциями, которые могут потребовать остановки до завершения.

Обратные вызовы:

Задачи поддерживают добавление обратных вызовов, что позволяет выполнять дополнительные действия при завершении задач.

Создание задач:

Задачи создаются с помощью функции asyncio.create_task(coroutine) или метода loop.create_task(coroutine), которые планируют выполнение корутины.


import asyncio

async def say_hello():
    print("Hello")
    await asyncio.sleep(1)
    print("World")
            
async def main():
    task = asyncio.create_task(say_hello())
    await task
            
asyncio.run(main())

7.2 Основные методы

Метод Task.cancel():

Запрашивает отмену задачи. Если задача ещё не завершена, она будет завершена с вызовом исключения CancelledError.

Давайте напишем небольшую программу, которая позволит нам это продемонстрировать.

  1. Создадим асинхронную задачу, которая будет просто ждать 10 секунд
  2. Обернём её в объект Task
  3. Подождём секунду, чтобы задача Task начала выполняться
  4. Отменим задачу – task.cancel()
  5. Если дальше попытаться подождать завершения задачи Task с помощью оператора await, то мы получим исключение CancelledError.

import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(10)) 
    await asyncio.sleep(1)
    task.cancel()
    try:
        await task
    except asyncio.CancelledError:
        print("Task was cancelled")
            
asyncio.run(main())

Метод Task.result():

Возвращает результат выполнения задачи. Если задача завершилась с исключением, оно будет вызвано при вызове result().


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1, result='Completed'))
    result = await task
    print(result)  # Output: Completed
            
asyncio.run(main())

В нашем случае даже не пришлось писать дополнительный код — оператор await понимает, как работать с объектом Task: после выполнения задачи он сам вызовет у него метод result() и вернёт полученный результат.

Метод Task.exception():

Возвращает исключение, вызванное задачей. Если задача завершилась без исключения, возвращает None.


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    try:
        result = await task
    except Exception as e:
        print(f"Task failed with exception: {e}")

asyncio.run(main())

Также дополнительный код писать не нужно — если в задаче возникло исключение, метод exception() будет вызван оператором await.

Метод Task.add_done_callback(callback):

Добавляет обратный вызов (callback), который будет вызван при завершении задачи.


import asyncio

def callback(future):
    print("Task completed")
            
async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    task.add_done_callback(callback)
    await task
            
asyncio.run(main())

К задаче можно добавить функцию, которая будет автоматически вызвана, когда задача завершит выполнение. Такой подход позволяет сделать код очень гибким. Более того, функций можно добавить несколько, и добавлять их можно к любым задачам.

Метод Task.done():

Возвращает True, если задача завершена (успешно, с ошибкой или была отменена).


import asyncio

async def main():
    task = asyncio.create_task(asyncio.sleep(1))
    await asyncio.sleep(1.5)
    print(task.done())  # Output: True
            
asyncio.run(main())

С помощью метода done() можно узнать, успешно ли выполнилась задача. Вернее, выполнилась она или была отменена, так как если возникло исключение, то формально задача может быть и не выполнена, но и отменена она не была. В общем, если задачу отменили cancel, то метод вернёт False, иначе вернёт True.

2
Задача
Модуль 1: Python Core, 14 уровень, 6 лекция
Недоступна
Управление циклом событий
Управление циклом событий
2
Задача
Модуль 1: Python Core, 14 уровень, 6 лекция
Недоступна
Отмена задачи
Отмена задачи
Комментарии (4)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Олег Уровень 24
30 сентября 2025
Метод Task.done()

Возвращает True, если задача завершена (успешно, с ошибкой или была отменена).
Тут всё правильно и понятно

С помощью метода done() можно узнать, успешно ли выполнилась задача.
Вернее, выполнилась она или была отменена, так как если возникло исключение,
то формально задача может быть и не выполнена, но и отменена она не была.
В общем, если задачу отменили cancel, то метод вернёт False, иначе вернёт True.
А это не правильно и не понятно, приходится гуглить.
Андрей Уровень 56
26 сентября 2024
Все примеры основаны на одной функции asyncio.sleep.....Может есть что то другое, чем просто подождать????
Vladimir Уровень 64
17 января 2025
sleep это эмуляция реальных действий программы, а не основная суть уроков
Ivan Уровень 59
15 мая 2025
Надо закрыть глаза и представить, что вместо sleep стоит перемножение двух матриц миллион на миллион. Или скачивание видео с ютуба.