2011-02-18 49 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

回答