我想爲我的Django 1.8應用程序運行py.test集成測試,使用 完整的Celery 3.1安裝程序,即使用真正的隊列(不是CELERY_ALWAYS_EAGER)。爲了做到這一點,我需要說服工作人員使用我的基於服務器的測試數據庫(PostgreSQL),而不是標準配置的數據庫(SQlite3,它不能與第二個進程交談)。芹菜工作者自省獲取主機名/節點名稱
爲此,我想在數據庫首次使用之前簡單修改工作進程中的DATABASES setting。 (我想保留用於其他py.test測試的SQlite以及用於交互測試的正常非測試數據庫)。
爲此,工作人員需要認識到它正在測試模式下運行,而不是'正常模式。 爲了表示測試模式,我開始工作者不同的節點名稱:
celery worker -A myapp --concurrency=1 -n myworker --loglevel=info
正常模式與
celery worker -A myapp --concurrency=1 -n mytestworker --loglevel=info
測試模式。
問題:如何在我的Django應用程序的celery.py模塊讀出 的節點名(主機名,與-n
選項設置)的工人?
似乎有涉及三個過程(我對併發性沒有進一步 配置超出上述=1
):
- 的
celery.exe
(我在Windows上), - 的工人本身,和
- 單工作進程(這是我的相關)。
這是正確的嗎?
似乎有不同signals芹菜發送到每一個過程:
celeryd_init
被髮送到celery.exe
,worker_init
被髮送到工人,worker_process_init
被髮送到工作進程
這也正確嗎?
我說在我的Django應用以下到celery.py
:
import celery.signals
def init_here(signal, sender):
print("call %s(sender=%s)" % (signal, sender))
@celery.signals.celeryd_init.connect
def celeryd_init(sender, instance, **kwargs):
init_here("celeryd_init", sender)
@celery.signals.worker_init.connect
def worker_init(sender, **kwargs):
init_here("worker_init", sender)
@celery.signals.worker_process_init.connect
def worker_process_init(sender, **kwargs):
init_here("worker_process_init", sender)
當我開始在測試模式下工作人員如上文所述,我得到下面的輸出(除其他事項外):
call celeryd_init([email protected])
call worker_init([email protected])
[2015-09-30 15:53:23,767: WARNING/MainProcess] [email protected] ready.
[2015-09-30 15:53:24,282: WARNING/Worker-1] call worker_process_init(sender=None)
太糟糕了!相關過程Worker-1
未收到相關信息[email protected]
。 它如何獲取主機名?
我的上面的問題確實是(由@Louis建議)最好由環境變量解決。但是,我仍然想知道所問的問題的答案。 –