14

Celery (最新の安定版) をインストールしました。 というディレクトリがあり/home/myuser/fable/jobsます。このディレクトリ内に、tasks.py というファイルがあります。

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

そこで、コンソール ( ) を使用して Celery ワーカーを実行し、$ celeryd --loglevel=INFO試してみました。Python コンソールを開き、タスクをインポートします。次に、Submitter を実行します。

>>> 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://GOGOme@localhost: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

誰か助けてくれませんか?

4

3 に答える 3

11

これは私がやったことで、最終的にはうまくいきました

Settings.py に追加しました

CELERY_IMPORTS = ("myapp.jobs", )

myapp フォルダーの下に、jobs.py というファイルを作成しました。

from celery.decorators import task

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

次に、コマンドラインから実行しました: python manage.py celeryd -l info

別のシェルで python manage.py シェルを実行し、次に

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

そして私は得る:

16

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

:-)

于 2011-08-01T14:16:59.453 に答える
10

インポートするには、tasks.py ファイルが django アプリ (settings.py に登録されている) にある必要があると思います。__init__.pyまたは、メイン プロジェクトまたはいずれかのアプリのファイルからタスクをインポートしてみてください。

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

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

(必要な場合-E-Bそうでない場合がありますが、それが私が使用しているものです)。

于 2011-01-10T01:46:56.527 に答える
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", )
于 2011-01-10T09:51:54.113 に答える