2011-02-18 69 views
6

我将芹菜作为守护进程运行,但我有时无法优雅地停止芹菜。当我发送TERM信号并且队列中有物品(在本例中为service celeryd stop)时,celeryd将停止接受新的工作,并关闭所有工作进程。但是,父进程不会关闭。停止芹菜的问题

我刚刚遇到了一个场景,我在两台单独的工作机器上运行了芹菜:A和B.在RabbitMQ服务器上有大约1000条消息,我关闭了A,并遇到了我上面解释的情况。 B继续工作,但随后停滞在服务器上剩下约40条消息。然而,我能够正确地阻止B.

我重新启动B,看看它是否会从队列中取出40个项目,但它不会。接下来,我很难杀死A,之后B抓住并完成了任务。

我的结论是父进程已经为我们的孩子保留了来自我们RabbitMQ服务器的40个项目。它会正确地收获孩子,但不会将项目释放回RabbitMQ,除非我手动杀死它。

有没有人遇到类似的东西?

我跑芹菜2.2.2

+0

很可能有些子进程仍然挂在IO操作上,当有I/O操作试图停止芹菜时,我遇到了类似的问题 - 进程停滞并且只有kill -9有帮助。 不知道这可能有帮助,但我会建议尝试一下,如果使用gevent或Eventlet(celeryd -P eventlet)作为线程运行celeryd将为您工作。 – Jerzyk 2011-03-22 14:22:31

回答