我将 celeryd 作为守护进程运行,但有时无法优雅地停止它。当我发送 TERM 信号并且队列中有项目(在这种情况下service celeryd stop
)时,celeryd 将停止接受新工作,并关闭所有工作进程。但是,父进程不会关闭。
我刚刚遇到了一个场景,我在两台独立的工作机器上运行 celeryd:A 和 B。在 RabbitMQ 服务器上有大约 1000 条消息时,我关闭了 A,并经历了我上面解释过的情况。B 继续工作,但随后因为服务器上留下大约 40 条消息而停滞不前。但是,我能够正确停止 B。
我重新启动了 B,看看它是否会将 40 个项目从队列中取出,但它不会。接下来,我硬杀了A,然后B抓住并完成了任务。
我的结论是父进程已经为它的子进程从我们的 RabbitMQ 服务器中保留了 40 个项目。它会正确地收割孩子,但除非我手动杀死它,否则不会将这些项目释放回 RabbitMQ。
有没有人经历过类似的事情?
我正在运行 Celery 2.2.2