• 3.1
  • Версия документации: 6.1

Задачи

New in Django 6.0.

Платформа задач обеспечивает контракт и возможности для фоновой работы, а не механизм, который ее выполняет. API задач определяет, как работа описывается, ставится в очередь и отслеживается, но фактическое выполнение оставляется внешней инфраструктуре.

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

Декоратор задач

task(*, priority=0, queue_name='default', backend='default', takes_context=False)

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

  • priority: устанавливает priority Task. По умолчанию 0.

  • queue_name: устанавливает queue_name Task. По умолчанию установлено значение «по умолчанию».

  • backend: устанавливает backend Task. По умолчанию установлено значение «по умолчанию».

  • takes_context: контролирует, принимает ли функция Task TaskContext. По умолчанию установлено значение «False». Подробности смотрите в Контексте задачи.

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

См. примеры использования в разделе «Определение задач <defining-tasks>».

Задание

class Task

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

Атрибуты «Задачи» не могут быть изменены. Подробности см. в разделе изменение задач.

priority

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

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

backend

Псевдоним серверной части «Задачи» должен быть поставлен в очередь. Это должно соответствовать серверной части, определенной в BACKEND.

queue_name

Имя очереди, в которую будет поставлена ​​задача. По умолчанию установлено значение «по умолчанию». Это должно соответствовать очереди, определенной в QUEUES, если только QUEUES не установлен в [].

run_after

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

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

name

Имя функции, дополненное task(). Это имя не обязательно уникально.

using(*, priority=None, backend=None, queue_name=None, run_after=None)

Создает новую «Задачу» с измененными настройками по умолчанию. Существующая Задача остается без изменений.

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

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

enqueue(*args, **kwargs)

Ставит задачу в очередь на серверную часть задачи для последующего выполнения.

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

Если Task недействителен в соответствии с серверной частью, вызывается InvalidTask.

См. примеры использования в разделе «Задачи постановки в очередь <enqueueing-tasks>».

aenqueue(*args, **kwargs)

async вариант enqueue.

get_result(result_id)

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

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

aget_result(*args, **kwargs)

асинхронный вариант get_result.

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

class TaskContext

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

Атрибуты TaskContext не могут быть изменены.

task_result

TaskResult выполняется в данный момент.

attempt

Количество текущих попыток выполнения этой Задачи, начиная с 1.

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

class TaskResultStatus

Enum, представляющий статус 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

Время, когда задача была поставлена ​​в очередь.

started_at

Время начала выполнения задачи с первой попытки.

last_attempted_at

Время начала выполнения последнего запуска «Задачи».

finished_at

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

backend

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

errors

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

return_value

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

Если Задача не завершилась успешно, выдается ValueError.

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

refresh()

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

arefresh()

Асинхронный вариант TaskResult.refresh().

is_finished

Завершено ли Задание (успешно или нет).

attempts

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

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

worker_ids

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

Ошибки задачи

class TaskError

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

traceback

Обратная трассировка (в виде строки) из возникшего исключения в случае сбоя Задачи.

exception_class

Класс исключения, возникающий при выполнении задачи.

Серверные части

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

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

class BaseTaskBackend

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

options

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

enqueue(task, args, kwargs)

Серверные части задач, подкласс которых BaseTaskBackend должны реализовывать этот метод как минимум.

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

aenqueue(task, args, kwargs)

Асинхронный вариант BaseTaskBackend.enqueue().

get_result(result_id)

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

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

aget_result(result_id)

Асинхронный вариант BaseTaskBackend.get_result().

validate_task(task)

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

Флаги функций

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

BaseTaskBackend.supports_defer

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

BaseTaskBackend.supports_async_task

Поддерживает ли серверная часть постановку в очередь асинхронных функций (сопрограмм).

BaseTaskBackend.supports_get_result

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

BaseTaskBackend.supports_priority

Поддерживает ли серверная часть выполнение задач в соответствии с их priority.

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

Особенность

DummyBackend

ImmediateBackend

supports_defer

Да

Нет

supports_async_task

Да

Да

supports_get_result

Нет

Нет [1]

supports_priority

Да [2]

Да [3]

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

Django включает в себя только серверную часть разработки и тестирования. Они поддерживают локальное выполнение и проверку. Готовые к работе серверные части см. в разделе Настройка серверной части задачи.

Немедленный бэкэнд

class ImmediateBackend

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

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

class DummyBackend

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

results

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

clear()

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

Исключения

exception InvalidTask

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

exception InvalidTaskBackend

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

exception TaskResultDoesNotExist

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

exception TaskResultMismatch

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

Сноски

Back to Top