在工作进程关闭时通知Celery任务停止

4 投票
2 回答
2081 浏览
提问于 2025-04-17 21:38

我在使用celery 3.X和RabbitMQ作为后台。有时候我需要重启celery(为了把新的代码更新推送到服务器)。但是有一个任务里面有个很大的循环,并且循环里有try/catch,这个任务可能需要几个小时才能完成。如果我停止这个任务然后稍后再重启,也不会有什么严重的问题。

问题是:每次我通过命令(sudo service celeryd stop)停止工作进程后,我都得手动杀掉这个任务(用kill -9命令);这个任务对工作进程发出的SIGTERM信号无动于衷。我看过Celery的文档和Stackoverflow,但找不到有效的解决办法。有没有什么想法可以解决这个问题?

2 个回答

-1

Celery 这个工具并不适合用来执行很长时间的任务,因为它会让处理这个任务的工作者停下来,只专注于这个任务。我建议你调整一下逻辑,让任务自己调用自己,而不是用循环。这样一来,当系统要关闭的时候,你当前的任务会完成,并且会在之前停止的地方继续进行。

另外,如果把任务分成小块,你就可以把这些小块任务分配给其他的工作者或主机,这可能是你将来想要做的事情。

0

发送QUIT信号会立即停止工作进程sudo service celeryd stop -QUIT

如果把CELERY_ACKS_LATE这个设置为True,当工作进程停止时正在运行的任务会在工作进程重新启动后再次执行。

撰写回答