Spec-Zone.ru › Celery

celery.contrib.abortable

Прерываемые задачи.

Для длительно выполняющихся Task может быть полезно поддерживать прерывание во время выполнения. Разумеется, такие задачи должны быть специально разработаны с поддержкой прерывания.

AbortableTask служит базовым классом для всех объектов Task, которые должны поддерживать прерывание со стороны производителей.

  • Производители могут вызывать метод abort() для экземпляров AbortableAsyncResult, запрашивая прерывание.

  • Потребители (рабочие процессы) должны периодически проверять (и учитывать!) метод is_aborted() в контролируемых точках метода run() задачи. Чем чаще, тем лучше.

Необходимая промежуточная коммуникация обеспечивается реализацией AbortableTask.

В потребителе:

from celery.contrib.abortable import AbortableTask
from celery.utils.log import get_task_logger

from proj.celery import app

logger = get_logger(__name__)

@app.task(bind=True, base=AbortableTask)
def long_running_task(self):
    results = []
    for i in range(100):
        # check after every 5 iterations...
        # (or alternatively, check when some timer is due)
        if not i % 5:
            if self.is_aborted():
                # respect aborted state, and terminate gracefully.
                logger.warning('Task aborted')
                return
            value = do_something_expensive(i)
            results.append(y)
    logger.info('Task complete')
    return results

В производителе:

import time

from proj.tasks import MyLongRunningTask

def myview(request):
    # result is of type AbortableAsyncResult
    result = long_running_task.delay()

    # abort the task after 10 seconds
    time.sleep(10)
    result.abort()

После вызова result.abort() выполнение задачи не прерывается немедленно. Более того, нет гарантии, что оно вообще будет прервано. Продолжайте проверять состояние result.state или вызовите result.get(timeout=), чтобы ожидать завершения задачи.

Примечание

Для прерывания задач необходима коммуникация между производителем и потребителем. Сейчас она реализована с помощью бэкенда базы данных. Поэтому этот класс работает только с бэкендами баз данных.

classcelery.contrib.abortable.AbortableAsyncResult(id, backend=None, task_name=None, app=None, parent=None)

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

В частности, этот класс предоставляет AsyncResult метод abort(), который устанавливает состояние базовой задачи в ‘ABORTED’.

abort()

Установить состояние задачи в ABORTED.

Прерываемые задачи регулярно проверяют своё состояние и в случае необходимости завершают выполнение.

Предупреждение

Обратите внимание: вызов этого метода не гарантирует, когда задача будет прервана (и даже то, что она вообще будет прервана).

is_aborted()

Возвращает True, если задача прерывается или уже прервана.

classcelery.contrib.abortable.AbortableTask

Задача, выполнение которой можно прервать.

Этот класс служит базовым для всех Task, поддерживающих прерывание во время выполнения.

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

AsyncResult(task_id)

Возвращает соответствующий экземпляр AbortableAsyncResult.

abstract=True

Устаревший атрибут abstract, оставленный здесь для совместимости.

is_aborted(**kwargs)

Возвращает истину, если задача прервана.

Проверяет в бэкенде, что этот AbortableAsyncResult находится в состоянии ABORTED.

Всегда возвращает False, если параметр task_id относится к обычной (непрерываемой) задаче Task.

Имейте в виду, что вызов этого метода обращается к бэкенду (например, выполняет запрос к базе данных), поэтому найдите разумный баланс: вызывайте его регулярно для быстрого реагирования, но не слишком часто, чтобы не снижать производительность.

Copyright © 2017-2026 Asif Saif Uddin, core team & contributors. All rights reserved.
Celery is licensed under The BSD License (3 Clause, also known as the new BSD license). The license is an OSI approved Open Source license and is GPL-compatible.
https://docs.celeryq.dev/en/stable/reference/celery.contrib.abortable.html

Spec-Zone.ru

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