这是以编程方式终止(取消)芹菜任务的最佳方法

时间:2018-10-09 15:43:09

标签: python python-3.x celery

根据Celery的文档,我们不应该在terminate函数中使用revoke()选项来取消正在执行的任务:

  

当任务卡住时,终止选项是管理员的不得已的选择。不是为了终止任务,而是为了终止正在执行任务的进程,并且该进程可能在发送信号时已经开始处理另一个任务,因此出于这个原因,您永远不能以编程方式调用此任务。

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

所以,我的问题是,如果我需要以编程方式取消一些正在运行的任务,应该怎么做?

1 个答案:

答案 0 :(得分:2)

如果您确实需要终止正在运行的任务,则在parse_date_time方法中使用terminate=True是正确的方法,也是您的最佳选择。问题在于这样做没有保证的效果,或者更好的说,可能会带来负面的影响。要了解原因,有必要知道撤销的工作原理和revoke()的工作。当您致电terminate=True时,您正在通过代理向您的工作人员发送广播消息。这意味着,在您意识到自己想要/需要杀死任务,发送撤销消息并接收工作人员的控制命令之前,工作人员可能已经完成了任务,从队列中抓取了另一个任务并开始进行工作。它。当它最终收到命令时,它只是杀死了工作进程,而该工作进程到那时可能已经在执行其他任务。

如果您事先知道您可能需要中止任务并可以调整任务代码,则可以查看abortable tasks