有没有办法非暴力地阻止芹菜工人的特殊任务?

时间:2016-05-18 11:17:05

标签: python celery

正如Celery documentation所述,除非设置了.revoke(),否则不会通过调用terminate=True来中止已经执行的任务。但不建议这样做,因为它会杀死工作人员本身,这可能已经开始了另一项任务。这是否意味着没有可靠,稳定的方法来做到这一点?

编辑:celery.contrib.abortable并不适合我,因为正如文档所述,它只适用于数据库后端。

2 个答案:

答案 0 :(得分:3)

正在运行的任务是worker的运行子进程(使用prefork时),这意味着中止任务的唯一方法是终止正在运行它的子进程。

您可以尝试尝试自己的撤销事件处理实现,试图找出子进程ID并仅杀死该进程ID,但老实说,不知道是否值得,以及它是否真的有效。

我认为简短的回答是你不能。

无论如何,有时需要杀死工作人员,特别是在项目的初始阶段,您仍需要正确地确定资源的维度,只需确保在某处运行正在运行的任务,以便您可以重新安排它们或仅使用CELERY_ACKS_LATE < / p>

答案 1 :(得分:1)

您可以发送HUP信号而不是TERM,它可以在不杀死工作人员的情况下正常重启子进程。

In [80]: import signal

In [81]: x = add.delay(1, 2)

In [82]: x.revoke(terminate=True, signal=signal.SIGHUP)