Класс 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 лекция
Недоступна
Отмена задачи
Отмена задачи
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Анатолий Уровень 63
11 февраля 2026
❤️
Олег Уровень 30
30 сентября 2025
Метод Task.done()

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

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