web-dev-qa-db-ja.com

RabbitMQを使用したCelery:AttributeError: 'DisabledBackend'オブジェクトには属性 '_get_task_meta_for'がありません

Celeryチュートリアルの最初のステップ を実行しています。

次のタスクを定義します。

from celery import Celery

app = Celery('tasks', broker='amqp://guest@localhost//')

@app.task
def add(x, y):
    return x + y

次に呼び出します:

>>> from tasks import add
>>> add.delay(4, 4)

しかし、次のエラーが表示されます。

AttributeError: 'DisabledBackend' object has no attribute '_get_task_meta_for'

セロリワーカーとrabbit-mqサーバーの両方を実行しています。奇妙なことに、セロリ労働者はタスクが成功したと報告します。

[2014-04-22 19:12:03,608: INFO/MainProcess] Task test_celery.add[168c7d96-e41a-41c9-80f5-50b24dcaff73] succeeded in 0.000435483998444s: 19 

なぜこれが機能しないのですか?

55
Casebash

チュートリアルを読み続けてください。 Keep Results の章で説明します。

Celeryを起動するには、タスクに関するメッセージを送信するために必要なブローカーパラメーターのみを指定する必要があります。完了したタスクによって返される状態と結果に関する情報を取得する場合は、バックエンドパラメーターを設定する必要があります。 設定ドキュメント:CELERY_RESULT_BACKEND で説明付きの完全なリストを見つけることができます。

44
daniula

以下をご覧になることをお勧めします: http://www.cnblogs.com/fangwenyu/p/3625830.html

そこには、代わりに

app = Celery('tasks', broker='amqp://guest@localhost//')

あなたは書くべきです

app = Celery('tasks', backend='amqp', broker='amqp://guest@localhost//')

これです。

36
TorokLev

誰かが私と同じミスを犯しやすいようにした場合:チュートリアルではそうは言っていませんが、

app = Celery('tasks', backend='rpc://', broker='amqp://')

tasks.pyファイルの行の編集です。鉱山は次のようになります:

app = Celery('tasks', backend='rpc://', broker='amqp://guest@localhost//')

コマンドラインからpythonを実行すると、

$ python
>>> from tasks import add
>>> result = add.delay(4,50)
>>> result.ready()
>>> False

すべてのチュートリアルは、少し酔っているときでも簡単に理解できるはずです。これまでのところ、このバーには到達していません。

20
Diederik

チュートリアルで明確になっていないのは、行を変更するためにtasks.pyモジュールを編集する必要があることです。

app = Celery('tasks', broker='pyamqp://guest@localhost//')

rPC結果のバックエンドを含めるには:

app = Celery('tasks', backend='rpc://', broker='pyamqp://')

完了したら、 Ctrl + C セロリワーカープロセスと再起動:

celery -A tasks worker --loglevel=info

チュートリアルは、アプリオブジェクトの作成がクライアントテストセッションで行われると仮定しているという点で混乱していますが、そうではありません。

1
Chris Foote

プロジェクトディレクトリで設定ファイルを見つけます。

その後:Sudo vim settings.pyをsettings.pyにコピー/貼り付け:CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'

注:これは、Django-celeryをキューにメッセージを保存するためのバックエンドとして使用している場合です。

1
Carlisle