2012-01-19 213 views
65

我一直在阅读文档和搜索,但似乎无法找到一个直接的答案:用Celery取消已经执行的任务?

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

我发现这个从文档在Celery FAQ

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

但我不清楚这是否会取消排队任务或者它是否会杀死一个工作者正在运行的进程。感谢您的任何光线!

回答

116

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

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

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

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

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

+0

这正是我正在寻找的解释,谢谢! – dcoffey3296

+0

这是否在分布式环境中工作?我的意思是如果我有多个正在执行任务的机器上的工作人员。芹菜是否跟踪执行任务的机器? – ksrini

+0

它的确如此。与工人的沟通通过经纪人进行。 – mher

24

在芹菜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) 
12

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

相关问题