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.
Давайте напишем небольшую программу, которая позволит нам это продемонстрировать.
Создадим асинхронную задачу, которая будет просто ждать 10 секундОбернём её в объектTaskПодождём секунду, чтобы задачаTaskначала выполнятьсяОтменим задачу –task.cancel()-
Если дальше попытаться подождать завершения задачи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.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ