2011-01-10 25 views
14

私はCelery(最新の安定版)をインストールしました 私は/home/myuser/fable/jobsというディレクトリを持っています。このディレクトリの中に、私はtasks.pyというファイルがあります。このディレクトリ内セロリはなぜPythonシェルで動作しますが、私の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ファイルを持っている:私の/etc/profile

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

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

、私はこれらのように設定しています私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." 

celerydクライアントは、起動時に登録済みであることを示しているため、変です。

[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

ジャンゴーセロリーやセロリを単独で使用していますか? –

答えて

10

インポートするためには、tasks.pyファイルが(settings.pyに登録されている)djangoアプリにある必要があります。また、メインプロジェクトまたはアプリケーションのいずれかのファイル__init__.pyからタスクをインポートすることもできます。

またmanage.pyからcelerydを起動してみてください:

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

-E-Bが必要か、あってもなくてもよいが、それは私が使うものです)。

+0

「あなたはジャンゴアプリにいなければなりません」とはどういう意味ですか?私は別のファイルとしてtasks.pyを持っていて、それを私のviews.pyにインポートします(仕事としてfable.jobs.tasksをインポートします) – TIMEX

+0

セロリに見えるようにタスクを登録する必要があります。 'views.py'ファイルでは自動的には発生しません。なぜなら、そのファイルはPythonによって自動的にロードされないからです。 Celeryがdjangoアプリにある 'tasks.py'というファイルでタスクを自動検索するか、' __init __。py'でタスクをインポートすることができます。 – Seth

+0

どのように私は(どこでも)Pythonシェルを実行すると、それは検出し、タスクを登録することができますか? – TIMEX

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私はその後jobs.py

from celery.decorators import task 

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

というファイルを作成しmyappのフォルダの下に

CELERY_IMPORTS = ("myapp.jobs",) 

を追加したコマンドラインから実行しました:Pythonのmanage.py celeryd -l情報

私が走った別のシェルでPythonのmanage.pyシェル、そして

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

と私が手:

重要な点は、新しい機能を追加するときに両方のコマンドシェルを再実行する必要があることです。名前はクライアントとサーバーの両方に登録する必要があります。

:-)

+0

このソリューションをお寄せいただき、ありがとうございます。チュートリアルにCELERY_IMPORTS行を含める必要があります。 – sequoia

+0

あなたのソリューションを投稿していただきありがとうございます。私は実際に明示的にCELERY_IMPORTSはdjcelery.setup_loader()が#celeryのコントリビュータによって処理されたdjango-celeryでは必要ないと言いました。私は野生のガチョウを不必要に追いかける必要があることを失望させた。 – mattdeboard

+1

-1ドキュメントは明示的に「myapp.jobs」としてインポートしないと言っています。この例では名前を指定していますが、この例は正しい方法よりもはるかに混乱しています。 http://docs.celeryq.org/en/latest/userguide/tasks.html#automatic-naming-and-relative-imports – citadelgrad

関連する問題