用芹菜取消已经执行的任务?
我一直在阅读文档和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=True
和signal='SIGUSR1'
(这会导致在任务中引发SoftTimeLimitExceededexception)。
请参阅以下任务的任务: time_limit , soft_time_limit (或者可以为工作人员设置)。 如果您不仅想要控制执行时间,请参阅apply_async方法的expires参数。