2011-01-10 21 views
14

我安裝了芹菜(最新穩定版)。 我有一個目錄叫/home/myuser/fable/jobs。在這個目錄裏,我有一個名爲tasks.py文件:爲什麼Celery在Python shell中工作,但不在我的Django視圖中工作? (進口問題)

from celery.decorators import task 
from celery.task import Task 

class Submitter(Task): 
    def run(self, post, **kwargs): 
     return "Yes, it works!!!!!!" 

在這個目錄裏,我也有一個名爲celeryconfig.py:

BROKER_HOST = "localhost" 
BROKER_PORT = 5672 
BROKER_USER = "abc" 
BROKER_PASSWORD = "xyz" 
BROKER_VHOST = "fablemq" 

CELERY_RESULT_BACKEND = "amqp" 
CELERY_IMPORTS = ("tasks",) 

在我/etc/profile,我有這些設置我的PYTHONPATH:

  • PYTHONPATH=/home/myuser/fable:/home/myuser/fable/jobs

所以我使用控制檯($ celeryd --loglevel=INFO)運行我的芹菜工作人員,然後我嘗試一下。 我打開Python控制檯並導入任務。然後,我運行提交者。

>>> import fable.jobs.tasks as tasks 
>>> s = tasks.Submitter() 
>>> s.delay("abc") 
<AsyncResult: d70d9732-fb07-4cca-82be-d7912124a987> 

一切正常,你可以在我的控制檯中看到

[2011-01-09 17:30:05,766: INFO/MainProcess] Task tasks.Submitter[d70d9732-fb07-4cca-82be-d7912124a987] succeeded in 0.0398268699646s: 

但是當我進入我的Django的views.py並運行確切3行代碼如上,我得到這個:

[2011-01-09 17:25:20,298: ERROR/MainProcess] Unknown task ignored: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported.": {'retries': 0, 'task': 'fable.jobs.tasks.Submitter', 'args': ('abc',), 'expires': None, 'eta': None, 'kwargs': {}, 'id': 'eb5c65b4-f352-45c6-96f1-05d3a5329d53'} 
Traceback (most recent call last): 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/listener.py", line 321, in receive_message 
    eventer=self.event_dispatcher) 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 299, in from_message 
    eta=eta, expires=expires) 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 243, in __init__ 
    self.task = tasks[self.task_name] 
    File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/registry.py", line 63, in __getitem__ 
    raise self.NotRegistered(str(exc)) 
NotRegistered: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported." 

這很奇怪,因爲芹菜客戶端在啓動時顯示它已註冊。

[2011-01-09 17:38:27,446: WARNING/MainProcess] 
Configuration -> 
    . broker -> amqp://[email protected]:5672/fablemq 
    . queues -> 
     . celery -> exchange:celery (direct) binding:celery 
    . concurrency -> 1 
    . loader -> celery.loaders.default.Loader 
    . logfile -> [stderr]@INFO 
    . events -> OFF 
    . beat -> OFF 
    . tasks -> 
     . tasks.Decayer 
     . tasks.Submitter 

有人可以幫忙嗎?

+0

你也使用django芹菜或芹菜本身? – 2012-03-20 18:37:47

回答

10

我相信你的tasks.py文件需要在django應用程序(在settings.py中註冊)才能導入。或者,您可以嘗試從主項目或其中一個應用程序導入__init__.py文件中的任務。

也可以嘗試從manage.py開始celeryd:

$ python manage.py celeryd -E -B -lDEBUG 

-E-B可能會或可能不會是必要的,但這是我使用)。

+0

你是什麼意思「需要在Django應用程序」?我有tasks.py作爲一個單獨的文件,並將其導入到我的views.py(導入fable.jobs.tasks作爲任務) – TIMEX 2011-01-10 01:48:17

+0

任務必須註冊才能被芹菜看到。這不會在`views.py`文件中自動發生,因爲該文件不會被python自動加載。我很確定Celery會自動在django應用程序中名爲`tasks.py`的文件中找到任務,或者您可以嘗試在`__init __。py`中導入任務。 – Seth 2011-01-10 01:52:10

5

請參閱自動命名和相對導入,在文檔:

http://celeryq.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

任務名稱爲「tasks.Submitter」(如celeryd輸出中列出), 但導入任務,「 fable.jobs.tasks.Submitter「

我想這裏最好的解決方案是,如果工作人員也把它看作」fable.jobs.tasks.Submitter「, 它從應用程序的角度來看更有意義。

CELERY_IMPORTS = ("fable.jobs.tasks",) 
11

這是我做這最後的設置工作

。PY我加

CELERY_IMPORTS = ("myapp.jobs",) 

MyApp文件夾下,我創建了一個名爲jobs.py

from celery.decorators import task 

@task(name="jobs.add") 
def add(x, y): 
    return x * y 

然後從命令行運行文件:蟒蛇manage.py在另一個shell我跑celeryd -l信息

蟒蛇manage.py殼,然後

>>> from myapp.jobs import add 
>>> result = add.delay(4, 4) 
>>> result.result 

和我得到:

重要的一點是,當你添加一個新函數時你必須重新運行這兩個命令shell。您必須在客戶端和服務器上註冊名稱。

:-)

相關問題