用Celery取消已执行的任务?

时间:2012-01-19 03:21:23

标签: python django celery message-passing

我一直在阅读文档和搜索,但似乎无法找到一个直接的答案:

你可以取消已执行的任务吗? (在任务开始时,需要一段时间,需要取消一半)

我是在Celery FAQ

的文档中找到的
>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

但是我不清楚这是否会取消排队的任务,或者它是否会杀死一个正在运行的进程。谢谢你能放下任何光线!

5 个答案:

答案 0 :(得分:148)

撤销取消任务执行。如果任务被撤销,则工作人员会忽略该任务而不执行该任务。如果不使用持久性撤销,则可以在工作人员重新启动后执行任务。

http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes

revoke默认有一个终止选项 False 。如果您需要终止正在执行的任务,则需要将终止设置为 True

>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks

答案 1 :(得分:31)

在Celery 3.1中,API of revoking tasks已更改。

根据Celery FAQ,你应该使用result.revoke:

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

或者如果您只有任务ID:

>>> from proj.celery import app
>>> app.control.revoke(task_id)

答案 2 :(得分:18)

@ 0x00mh的答案是正确的,但是最近的芹菜docs说使用terminate选项是“管理员的最后手段”,因为你可能会意外地终止另一个任务在此期间开始执行。可能更好的解决方案是将terminate=Truesignal='SIGUSR1'相结合(这会导致在任务中引发SoftTimeLimitExceeded异常)。

答案 3 :(得分:1)

请参阅以下任务选项:time_limitsoft_time_limit(或者您可以为工作人员设置)。如果您不仅要控制执行时间,请参阅apply_async方法的expires参数。

答案 4 :(得分:0)

此外,还不能令人满意,还有另一种方法(中止任务)来停止任务,但是存在许多不可靠性,更多详细信息,请参见: http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html