正如Celery documentation所述,除非设置了.revoke()
,否则不会通过调用terminate=True
来中止已经执行的任务。但不建议这样做,因为它会杀死工作人员本身,这可能已经开始了另一项任务。这是否意味着没有可靠,稳定的方法来做到这一点?
编辑:celery.contrib.abortable
并不适合我,因为正如文档所述,它只适用于数据库后端。
答案 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)