2012-10-23 98 views
1

我試圖使用Celery與RabbitMQ後端在Fedora上運行異步後臺任務,我發現它令人沮喪地不可靠。最大的問題是它偶爾會多次運行相同的任務,並且在診斷原因時遇到問題。Celeryd運行多個守護進程

我不認爲我的代碼多次觸發任務,因爲我通過手動啓動任務(創建數據庫記錄)來測試一次,並且看到創建了兩個相同的記錄。如果我從Django shell運行代碼,只創建一條記錄,所以問題肯定是Celery。

我有3個服務器,每個運行celeryd,只有第一個運行rabbitmq,並且所有3個服務器共享相同的數據庫。我的第一個通過是,我的芹菜設置有問題,導致每臺服務器上的芹菜檢索並執行相同的任務。然而,芹菜文檔中沒有任何東西似乎區分單個主機和多主機設置,因此假設我已經在每個服務器的settings.py中指定了正確的BROKER_HOST/PORT/USER/PASSWORD/VHOST,它應該「只是工作「與多個主機。它是否正確?

另一個想法是我可能以某種方式運行芹菜的多個實例,雖然我不知道如何檢查這個。兩個服務器都運行Fedora 13,當我運行ps aux | grep .*.py我得到:

root  24806 0.1 1.8 51404 31328 ?  Sl Oct19 9:25 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 
root  24900 0.1 1.6 51404 28592 ?  S Oct19 6:02 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 
root  24901 0.3 9.4 183232 161948 ?  S Oct19 22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 

這是否意味着3個獨立的celeryd的實例在運行?如果是這樣,這是一個錯誤,我應該殺死其中的2個?

我的第三臺服務器運行Fedora 17,它有不同的服務框架。當我運行systemctl status celeryd.service我得到:

celeryd.service - LSB: celery task worker daemon 
     Loaded: loaded (/etc/rc.d/init.d/celeryd) 
     Active: active (exited) since Fri, 19 Oct 2012 10:59:38 -0400; 4 days ago 
    Process: 732 ExecStop=/etc/rc.d/init.d/celeryd stop (code=exited, status=0/SUCCESS) 
    Process: 738 ExecStart=/etc/rc.d/init.d/celeryd start (code=exited, status=0/SUCCESS) 
     CGroup: name=systemd:/system/celeryd.service 

我不知道如何解釋這一點。 「活躍」通常在運行,但「退出」通常意味着它沒有運行。當我運行ps aux | grep .*celery.*我只得到:

root  25142 0.0 0.0 109400 932 pts/0 S+ 11:28 0:00 grep --color=auto .*celery.* 

那麼,這是否意味着celeryd沒有運行,或者我應該尋找別的東西嗎?

編輯:基於this的答案,我認爲這3個過程可能是默認的。

+0

行的我是複製表明您運行的多個實例celerybeat。這是真的?根24901 0.3 9.4 183232 161948? S Oct19 22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B - -scheduler djcelery.schedulers.DatabaseScheduler –

回答

2

我張貼的評論,但我相信這是你的問題,在這裏看到:

root  24806 0.1 1.8 51404 31328 ?  Sl Oct19 9:25 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 
root  24900 0.1 1.6 51404 28592 ?  S Oct19 6:02 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 
root  24901 0.3 9.4 183232 161948 ?  S Oct19 22:32 ../../.env/bin/python manage.py celeryd -f /var/log/myapp/celeryd.log -l WARNING --pidfile /var/run/celeryd.pid -B --scheduler djcelery.schedulers.DatabaseScheduler 

跑步celeryd與拍三次。所以,你的發送節拍消息三次。

您應該只有一個實例與節拍上,或者在自己的(最好)運行celerybeat並採取-B關閉celeryd實例

+0

我剛剛發現了一些確認你關於celerybeat的觀點的文檔。 http://ask.github.com/celery/getting-started/periodic-tasks.html – Cerin