Spec-Zone.ru › Django 6.0

Задачи

Добавлено в Django 6.0.

Определение задачи

Декоратор task

task(*, priority=0, queue_name='default', backend='default', takes_context=False) [источник]

Декоратор @task определяет экземпляр Task. Он принимает следующие необязательные аргументы:

  • priority: задаёт priority объекта Task. По умолчанию равно 0.
  • queue_name: задаёт queue_name объекта Task. По умолчанию равно "default".
  • backend: задаёт backend объекта Task. По умолчанию равно "default".
  • takes_context: определяет, принимает ли функция Task аргумент TaskContext. По умолчанию равно False. Подробности см. в разделе Контекст задачи.

Если определённый объект Task недопустим для бэкенда, вызывается исключение InvalidTask.

Примеры использования см. в разделе определение задач.

Task

class Task [источник]

Представляет задачу, выполняемую в фоновом режиме. Задачи следует определять с помощью декоратора task().

Атрибуты объекта Task нельзя изменять. Подробности см. в разделе изменение задач.

priority

Приоритет объекта Task. Приоритет должен находиться в диапазоне от -100 до 100. Чем больше число, тем выше приоритет и тем раньше будет выполнена задача.

Чтобы использовать эту возможность, атрибут supports_priority бэкенда должен иметь значение True.

backend

Псевдоним бэкенда, в очередь которого следует добавить объект Task. Он должен соответствовать бэкенду, определённому в BACKEND.

queue_name

Имя очереди, в которую будет добавлен объект Task. По умолчанию равно "default". Оно должно соответствовать очереди, определённой в QUEUES, если только для QUEUES не задано значение [].

run_after

Самое раннее время выполнения объекта Task. Это может быть timedelta, отсчитываемое от текущего времени, объект datetime с часовым поясом или None, если ограничение не задано. По умолчанию равно None.

Чтобы использовать эту возможность, атрибут supports_defer бэкенда должен иметь значение True. В противном случае вызывается исключение InvalidTask.

name [источник]

Имя функции, декорированной с помощью task(). Это имя не обязательно должно быть уникальным.

using(*, priority=None, backend=None, queue_name=None, run_after=None) [источник]

Создаёт новый объект Task с изменёнными значениями по умолчанию. Существующий объект Task остаётся без изменений.

using позволяет изменять следующие атрибуты:

  • priority
  • backend
  • queue_name
  • run_after

Примеры использования см. в разделе изменение задач.

enqueue(*args, **kwargs) [источник]

Добавляет объект Task в очередь бэкенда Task для последующего выполнения.

Аргументы передаются функции объекта Task после цикла сериализации и десериализации с помощью json.dumps()/json.loads(). Поэтому все аргументы должны быть сериализуемы в JSON, а их типы должны сохраняться после такого преобразования.

Если объект Task недопустим для бэкенда, вызывается исключение InvalidTask.

Примеры использования см. в разделе добавление задач в очередь.

aenqueue(*args, **kwargs)

Асинхронный вариант метода enqueue — async.

get_result(result_id) [источник]

Получает результат по его идентификатору.

Если результат не существует, вызывается исключение TaskResultDoesNotExist. Если результат имеет тип, отличный от типа текущей задачи, вызывается исключение TaskResultMismatch. Если бэкенд не поддерживает get_result(), вызывается исключение NotImplementedError.

aget_result(*args, **kwargs)

Асинхронный вариант метода get_result — async.

Контекст задачи

class TaskContext [источник]

Содержит контекст выполняемой Task. Контекст передаётся объекту Task только в том случае, если он был определён с помощью takes_context=True.

Атрибуты объекта TaskContext нельзя изменять.

task_result

Выполняемый в данный момент объект TaskResult.

attempt [источник]

Номер текущей попытки выполнения этой задачи, начиная с 1.

Результаты задач

class TaskResultStatus [источник]

Перечисление, представляющее статус объекта TaskResult.

READY

Объект Task только что добавлен в очередь или готов к повторному выполнению.

RUNNING

Объект Task выполняется в данный момент.

FAILED

Во время выполнения объекта Task возникло исключение или задачу не удалось запустить.

SUCCESSFUL

Объект Task успешно выполнен.

class TaskResult [источник]

Объект TaskResult хранит информацию о конкретном выполнении задачи Task.

Атрибуты объекта TaskResult нельзя изменять.

task

Задача Task, для которой был добавлен в очередь этот результат.

id

Уникальный идентификатор результата, который можно передать в Task.get_result().

Формат идентификатора зависит от используемого бэкенда. Идентификаторы результатов задач всегда являются строками длиной менее 64 символов.

Подробнее см. в разделе Результаты задач.

status

status результата.

enqueued_at

Время добавления объекта Task в очередь.

started_at

Время начала выполнения объекта Task при первой попытке.

last_attempted_at

Время начала последнего запуска объекта Task.

finished_at

Время завершения выполнения объекта Task — успешно или с ошибкой.

backend

Бэкенд, из которого получен результат.

errors

Список экземпляров TaskError для ошибок, возникших при каждом выполнении задачи.

return_value [источник]

Возвращаемое значение функции Task.

Если объект Task не завершился успешно, вызывается исключение ValueError.

Примеры использования см. в разделе возвращаемые значения.

refresh() [источник]

Обновляет атрибуты результата из хранилища очереди.

arefresh()

Асинхронный вариант метода TaskResult.refresh() — async.

is_finished [источник]

Показывает, завершился ли объект Task (успешно или нет).

attempts [источник]

Количество запусков задачи.

Если задача выполняется в данный момент, этот запуск не считается попыткой.

worker_ids

Идентификаторы рабочих процессов, выполнявших задачу.

Ошибки задач

class TaskError

Содержит информацию об ошибке, возникшей при выполнении объекта Task.

traceback

Трассировка стека (в виде строки) возникшего исключения, из-за которого завершилось с ошибкой выполнение объекта Task.

exception_class

Класс исключения, возникшего при выполнении объекта Task.

Бэкенды

Базовый бэкенд

class BaseTaskBackend [источник]

BaseTaskBackend — родительский класс для всех бэкендов задач.

options

Словарь дополнительных параметров бэкенда задач. Они задаются с помощью настройки OPTIONS.

enqueue(task, args, kwargs) [источник]

Бэкенды задач, наследующие BaseTaskBackend, должны как минимум реализовать этот метод.

После реализации enqueue() добавляет объект task — экземпляр Task — в очередь для последующего выполнения. args — это позиционные аргументы, а kwargs — именованные аргументы, передаваемые объекту task. Возвращает экземпляр TaskResult.

aenqueue(task, args, kwargs)

Асинхронный вариант метода BaseTaskBackend.enqueue() — async.

get_result(result_id) [источник]

Получает результат по его идентификатору. Если результат не существует, вызывается исключение TaskResultDoesNotExist.

Если бэкенд не поддерживает get_result(), вызывается исключение NotImplementedError.

aget_result(result_id)

Асинхронный вариант метода BaseTaskBackend.get_result() — async.

validate_task(task) [источник]

Проверяет, можно ли добавить предоставленный объект Task в очередь с помощью этого бэкенда. Если задача недопустима, вызывается исключение InvalidTask.

Флаги возможностей

Некоторые бэкенды могут поддерживать не все возможности Django. Можно определить, какие возможности поддерживает бэкенд, и при необходимости соответствующим образом изменить поведение.

BaseTaskBackend.supports_defer

Показывает, поддерживает ли бэкенд добавление задач в очередь для выполнения после заданного времени с помощью атрибута run_after.

BaseTaskBackend.supports_async_task

Показывает, поддерживает ли бэкенд добавление асинхронных функций (корутин) в очередь.

BaseTaskBackend.supports_get_result

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

BaseTaskBackend.supports_priority

Показывает, поддерживает ли бэкенд выполнение задач в порядке, заданном их атрибутом priority.

В таблице ниже указано, какие из встроенных бэкендов поддерживают те или иные возможности:

Возможность

DummyBackend

ImmediateBackend

supports_defer

Да

Нет

supports_async_task

Да

Да

supports_get_result

Нет

Нет [1]

supports_priority

Да [2]

Да [3]

Доступные бэкенды

Непосредственный бэкенд

class ImmediateBackend [источник]

Непосредственный бэкенд выполняет задачи сразу, а не в фоновом режиме.

Фиктивный бэкенд

class DummyBackend [источник]

Фиктивный бэкенд не выполняет задачи, добавленные в очередь. Вместо этого он сохраняет результаты задач для последующего просмотра.

results

Список результатов задач, добавленных в очередь, в порядке их добавления.

clear() [источник]

Очищает список сохранённых результатов.

Исключения

exception InvalidTask [исходный код]

Возникает, если Task, которую пытаются поставить в очередь, недействительна.

exception InvalidTaskBackend [исходный код]

Возникает, если запрошенный BaseTaskBackend недействителен.

exception TaskResultDoesNotExist [исходный код]

Возникает в get_result(), если указанный result_id не существует.

exception TaskResultMismatch [исходный код]

Возникает в get_result(), если указанный result_id относится к другой задаче, а не к текущей.

Сноски

[1]

ImmediateBackend официально не поддерживает get_result(), несмотря на реализацию API, поскольку результат нельзя получить из другого потока.

[2]

В DummyBackend задано supports_priority=True, чтобы его можно было использовать в тестах как прямую замену. Поскольку эта серверная часть никогда не выполняет задачи, значение priority не оказывает влияния.

[3]

В ImmediateBackend задано supports_priority=True, чтобы его можно было использовать в тестах как прямую замену. Поскольку задачи выполняются сразу после планирования, значение priority не оказывает влияния.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/tasks/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API