根据 Celery 的文档,我们不应该使用terminate
选项中revoke()
取消正在执行的任务的函数:
当任务陷入困境时,终止选项是管理员的最后手段。它不是为了终止任务,而是为了终止正在执行任务的进程,并且该进程可能在发送信号时已经开始处理另一个任务,因此,您绝对不能以编程方式调用它。
http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks
所以,我的问题是,如果我需要以编程方式取消某些正在运行的任务,我应该如何正确执行?
如果您确实需要终止正在运行的任务,请使用terminate=True
in revoke()
方法才是正确的方法,也是你最好的选择。问题是这样做并不能保证效果,或者更好地说,可能会产生负面影响。要了解原因,有必要了解撤销的工作原理以及撤销的内容terminate=True
做。你打电话时revoke()
,您正在通过代理向您的工作人员发送广播消息。这意味着,在您意识到想要/需要终止任务、发送撤销消息并接收工作人员的控制命令之前,工作人员可能已经完成了该任务,从队列中抓取了另一个任务并开始工作它。当它最终收到命令时,它只会杀死工作进程,到那时,它可能已经在处理不同的任务了。
如果您事先知道可能需要中止任务并且可以调整任务代码,您可以看一下可中止的任务 http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)