用芹菜取消已经执行的任务?

我一直在阅读文档和search,但似乎无法find一个直接的答案:

你能取消一个已经执行的任务吗? (如在任务已经开始,需要一段时间,并通过它的一半需要被取消)

我从Celery FAQ的文档中find这个

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

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

撤销取消任务执行。 如果任务被撤销,工作人员忽略任务,不执行任务。 如果你不使用持续的撤销,你的任务可以在工人重新启动后执行。

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

撤销有一个终止选项,默认为False 。 如果你需要杀死正在执行的任务,你需要将terminate设置为True

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

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

在Celery 3.1中, 撤销任务的API被改变了。

根据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) 

@ 0x00mh的答案是正确的,但是最近的芹菜文档说使用terminate选项是“ pipe理员的最后手段 ”,因为你可能意外终止了另一个同时开始执行的任务。 可能更好的解决scheme是将terminate=Truesignal='SIGUSR1' (这会导致在任务中引发SoftTimeLimitExceededexception)。

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