Прервать текущее задание в Сельдере в Джанго - PullRequest
6 голосов
/ 26 августа 2010

Я хотел бы иметь возможность отменить задачу, которая выполняется из очереди Celery (используя rabbitMQ).Я вызываю задачу, используя

task_id = AsyncBoot.apply_async(args=[name], name=name, connect_timeout=3)

, где AsyncBoot - определенная задача.

Я могу получить идентификатор задачи (при условии, что это длинная строка, возвращаемая apply_async) и сохранить ее вбаза данных, но я не уверен, как вызвать метод прерывания.Я вижу, как сделать методы прерываемыми с помощью класса Abortable tasks, но если у меня есть только строка идентификатора задачи, как я могу вызвать .abort () для задачи?Спасибо.

Ответы [ 2 ]

10 голосов
/ 31 августа 2010

apply_async возвращает AsyncResult экземпляр, или в этом случае AbortableAsyncResult.Сохраните task_id и используйте его для создания нового AbortableAsyncResult позже, убедившись, что вы указали необязательный аргумент бэкэнда, если не используете default_backend.

abortable_async_result = AsyncBoot.apply_async(args=[name], name=name, connect_timeout=3)
myTaskId = abortable_async_result.task_id

Позже:

abortable_async_result = AbortableAsyncResult(myTaskId)
abortable_async_result.abort()
4 голосов
/ 27 августа 2010

Вы видели справочную документацию?http://celeryq.org/docs/reference/celery.contrib.abortable.html

Чтобы отменить задание, используйте result.abort():

>>> result = AsyncBoot.apply_async(...)
>>> result.abort()
...