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

2024-04-19 11:54:03 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 方法文档数据库truecontribedit建议celery
2条回答

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

您可以尝试尝试自己的revoke事件处理实现,尝试找出子进程ID并只杀死该子进程,但老实说,不知道它是否值得,它是否真的可以工作。在

我想简短的回答是你不能

无论如何,有时需要杀死工作人员,特别是在项目的初始阶段,您仍然需要正确地标注资源,只需确保将正在运行的任务记录在某个位置,以便可以重新安排它们或使用CELERY_ACKS_LATE

您可以发送HUP信号而不是TERM,它优雅地重新启动子进程,而不会杀死工作进程。在

In [80]: import signal

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

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

相关问题 更多 >