我試圖使用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個過程可能是默認的。
行的我是複製表明您運行的多個實例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 –