2015-09-30 68 views
1

我想爲我的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):

  1. celery.exe(我在Windows上),
  2. 工人本身,和
  3. 工作進程(這是我的相關)。

這是正確的嗎?

似乎有不同signals芹菜發送到每一個過程:

  1. celeryd_init被髮送到celery.exe
  2. worker_init被髮送到工人
  3. 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]。 它如何獲取主機名?

+0

我的上面的問題確實是(由@Louis建議)最好由環境變量解決。但是,我仍然想知道所問的問題的答案。 –

回答

0

即使您可以使用它,我也不建議使用工作人員名稱來檢測您是否處於測試模式。這將是一個黑客。

我已經解決了知道在測試模式下我的代碼是否正在運行與否的問題的方法是讓proj/test_settings.py稱爲不同的設置文件(而「常規」,一個是在proj/settings.py),其中proj是我的項目的名稱(與下面的PROJ相同)。我有它創建決定了我們是否處於測試模式或沒有設置:

from .settings import * 

PROJ_TESTING = True 

此變量只能由test_settings文件設置爲true。請注意,在此test_settings.py文件中也可能有一些行覆蓋settings.py中設置的默認值。例如,我確實有代碼可以改變數據庫配置和日誌記錄。

我安排啓動測試的代碼來設置環境變量DJANGO_SETTINGS_MODULE=proj.test_settings。由於我測試中使用的芹菜工作人員是通過運行我的測試的代碼啓動的,因此他們正在加載測試設置並以PROJ_TESTING爲準。因此,要檢查測試模式,如果我需要,我可以這樣做:

from django.conf import settings 

if settings.PROJ_TESTING: 
    # Do what we need when we are testing. 
else: 
    # Do something else. 

做事的這種方法反映了我們如何通過DEBUG設置設定爲True設置調試模式。