2013-01-23 80 views
4

我使用Django的芹菜運行中涉及到的聯繫人/電子郵件解析背景兩個任務。Django和芹菜:任務不導入

結構是:

project 
    /api 
    /core 
     tasks.py 
    settings.py 

settings.py文件包含:

BROKER_URL = 'django://' 
BROKER_BACKEND = "djkombu.transport.DatabaseTransport" 

#celery 
BROKER_HOST = "localhost" 
BROKER_PORT = 5672 
BROKER_USER = "guest" 
BROKER_PASSWORD = "guest" 
BROKER_VHOST = "/" 

sys.path.append(os.path.dirname(os.path.basename(__file__))) 
CELERY_IMPORTS = ['project.core.tasks'] 

import djcelery 
djcelery.setup_loader() 

# .... 

INSTALLED_APPS = (
    #... 

    'kombu.transport.django', 
    'djcelery', 
) 

tasks.py包含:

from celery.task import Task 
from celery.registry import tasks 

class ParseEmails(Task): 
    #... 

class ImportGMailContactsFromGoogleAccount(Task): 
    #... 

tasks.register(ParseEmails) 
tasks.register(ImportGMailContactsFromGoogleAccount) 

此外,在wsgi.py添加

os.environ["CELERY_LOADER"] = "django" 

現在,我有這個應用程序託管在WebFactional服務器上。在我的本地這個運行良好,但WebFaction服務器,其中Django應用程序部署在Apache服務器上,我得到:

2013-01-23 17:25:00,067: ERROR/MainProcess] Task project.core.tasks.ImportGMailContactsFromGoogleAccount[df84e03f-9d22-44ed-a305-24c20407f87c] raised exception: Task of kind 'project.core.tasks.ImportGMailContactsFromGoogleAccount' is not registered, please make sure it's imported. 

但任務顯示爲註冊。如果我運行

python2.7 manage.py celeryd -l info 

我獲得:

-------------- [email protected] v3.0.13 (Chiastic Slide) 
---- **** ----- 
--- * *** * -- [Configuration] 
-- * - **** --- . broker:  django://localhost// 
- ** ---------- . app:   default:0x1e55350 (djcelery.loaders.DjangoLoader) 
- ** ---------- . concurrency: 8 (processes) 
- ** ---------- . events:  OFF (enable -E to monitor this worker) 
- ** ---------- 
- *** --- * --- [Queues] 
-- ******* ---- . celery:  exchange:celery(direct) binding:celery 
--- ***** ----- 

[Tasks] 
    . project.core.tasks.ImportGMailContactsFromGoogleAccount 
    . project.core.tasks.ParseEmails 

我認爲這可能是一個相對導入錯誤,但我認爲在settings.py的變化和wsgi.py會阻止。

我在想WebFactional支持的多個Python版本可能需要這樣做,但是我安裝了Python 2.7的所有庫,並且我也運行了Django for 2.7,所以應該沒有問題。

在本地主機上運行使用celeryd -l信息的任務列表中還顯示了,當我啓動工作,但是當我調用任務就不會輸出錯誤 - 它運行完美。

謝謝

回答

2

我曾在一個新的Ubuntu 12.04 /阿帕奇/ mod_wsgi的/ Django的1.5 /芹菜3.0.13生產環境相同的問題。一切正常,我的Mac Os X 10.8筆記本電腦和我的舊服務器(其中有Celery 3.0.12),但沒有在新的服務器上。

似乎有芹菜中的一些問題: https://github.com/celery/celery/issues/1150

我最初的溶液改變我的任務類基於任務爲基礎,以@task裝飾,從這樣的事情:

class CreateInstancesTask(Task): 
    def run(self, pk): 
     management.call_command('create_instances', verbosity=0, pk=pk) 
tasks.register(CreateInstancesTask) 

喜歡的東西這個:

@task() 
def create_instances_task(pk): 
    management.call_command('create_instances', verbosity=0, pk=pk) 

現在這個任務似乎工作,但我當然要做一些進一步的測試...

+0

這是奇怪的,你提到的,我已經在使得它的工作是準確地從任務類更改爲裝飾功能也同時在做。然而這隻有在某些方面運行芹菜時纔有效。使用「celery -worker」工作,但例如「celery-multi start 1」不會在manage.py目錄中使用「manage.py celeryd_multi start 1」,從而產生與使用不同的結果。我想我真正能做到的唯一方法就是深入調查問題。 –