2016-05-13 60 views
3

在我的芹菜任務中,我有一個使用在GPU上運行的python模塊(theano)的任務,該模塊只能同時由一個線程導入。但開始的網站,我要跑:如何分離Django和芹菜?

python manage.py runserver 
celery -A celery_try worker -l info 

所以該模塊將由兩個芹菜和Django的網站,這是衝突進口。有沒有辦法將Django和Celery分開,以便模塊只導入一次?

+0

我不知道爲什麼運行這兩個進程意味着你必須導入模塊。如果你不想在其中一箇中導入它,就不要。 –

+0

在Django視圖中,我導入任務,因此Django服務器導入相同的模塊tasks.py導入,而celery導入任何tasks.py導入,這就是兩個過程如何導入模塊。 – Demonedge

+0

默認情況下芹菜本身在django之外運行! 這是你如何初始化它,例如如果您的模塊正在加載所有的django堆棧和所有的django應用程序 – Jerzyk

回答

0

出於測試目的,您可以以單線程模式運行django開發服務器:python manage.py runserver --nothreading

你想import theano只在芹菜工作進程中,而不是在Django web服務器進程中,對不對?好的,讓我們進行條件導入,以便它被導入到芹菜而不是Django中。

import os 

try: 
    # next line will raise exception in django, but will work fine in celery 
    is_worker = os.environ['celery_worker'] 
    import theano # celery will import theano, django won't 
except Exception as exc: 
    # django code will catch exception that celery_worker doesn't exist and print it here 
    print exc 

,並開始與celery_worker環境變量設置你的芹菜工人:

celery_worker=yes celery -A celery_try worker -l info 

爲了不Django的過程芹菜工人和Django的區分,讓我們設置在芹菜過程中的bash環境變量,但。我稱這個變量爲celery_worker。爲了設置它,我在celery -A celery_try worker -l info前加了per-command env variable assignmentcelery_worker=yes。現在,在python代碼中,我檢查環境變量是否存在。如果是這樣,我們在芹菜工人,並需要進口theano。

如果我們在Django,os.environ['celery_worker']不應該被定義,應該引發異常。

+0

'python manage.py runserver --nothreading'不起作用,我仍然得到相同的錯誤信息。我不太理解你的解耦解決方案,你可以解釋一下嗎?謝謝。 – Demonedge

+0

@Demonedge你只想在芹菜工作進程中導入theano',而不是在django web服務器進程中,對吧?好的,讓我們進行條件導入,以便它被導入到芹菜而不是Django中。爲了區分芹菜工和django,讓我們在芹菜過程中設置一個bash環境變量,但不是在django過程中。我調用了變量'celery_worker'。爲了設置它,我使用per-command env變量賦值'celery_try worker -l info'命令:'celery_worker = yes'。現在,在python代碼中,我檢查環境變量是否存在,以及它是否導入theano。 –

+0

問題是我不能選擇不導入Theano。當我啓動服務器時,views.py將自動從Celery導入任務,這將導入Theano。當我運行芹菜工作來處理任務時,芹菜將再次導入tasks.py,這將再次導入Theano。 – Demonedge