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