web-dev-qa-db-ja.com

Celery AttributeError:非同期エラー

Mac(OS/X 10.13.4)でRabbitMQとCeleryをローカルで実行しています。add.delay(x、y)を実行すると、次のコードがローカルで動作します。

#!/usr/bin/env python
from celery import Celery
from celery.utils.log import get_task_logger

logger = get_task_logger(__name__)

app = Celery('tasks', \
        broker='pyamqp://appuser:xx@c2/appvhost', \
        backend='db+mysql://appuser:xx@c2/pigpen')

@app.task(bind=True)
def dump_context(self, x, y):
    print('Executing task id {0.id}, args: {0.args!r} kwargs {0.kwargs!r}'.format(self.request))

@app.task
def add(x, y):
    logger.info('Adding {0} + {1}'.format(x, y))
    return x + y

ただし、Kali 2018.2を実行しているODROID-C2でCeleryワーカーを実行しようとすると(現在の更新で、celery -A tasks worker --loglevel=infoを実行すると次のエラーが発生します。

Traceback (most recent call last):
  File "/usr/local/bin/celery", line 11, in <module>
    sys.exit(main())
  File "/usr/local/lib/python2.7/dist-packages/celery/__main__.py", line 14, in main
    _main()
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 326, in main
    cmd.execute_from_commandline(argv)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 488, in execute_from_commandline
    super(CeleryCommand, self).execute_from_commandline(argv)))
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 281, in execute_from_commandline
    return self.handle_argv(self.prog_name, argv[1:])
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 480, in handle_argv
    return self.execute(command, argv)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/celery.py", line 412, in execute
    ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/worker.py", line 221, in run_from_argv
    return self(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/base.py", line 244, in __call__
    ret = self.run(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/celery/bin/worker.py", line 255, in run
    **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/worker.py", line 99, in __init__
    self.setup_instance(**self.prepare_args(**kwargs))
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/worker.py", line 122, in setup_instance
    self.should_use_eventloop() if use_eventloop is None
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/worker.py", line 241, in should_use_eventloop
    self._conninfo.transport.implements.async and
  File "/home/autossh/.local/lib/python2.7/site-packages/kombu/transport/base.py", line 125, in __getattr__
    raise AttributeError(key)
AttributeError: async

Kali ODROIDから、Python Pikaスクリプトとそのデバイスのmysqlを使用してc2というホスト上のRabbitMQインスタンスに接続でき、c2マシンでも機能します。私は同様のエラーを見つけましたが、それらの解決策のどれも私のために働いていません。

Pipを介してODROID-C2にインストールされるCeleryバージョンは次のとおりです。

celery --version
4.1.0 (latentcall)
56
DYoung

Celery == 4.1.1に更新するだけでソートしました

4.1.Xの最新リリースは、kombuのモジュール名の変更を整理したようです。

89
shipperizer

Kombu 4.1.0を使用していることを確認してください。 Kombuの最新バージョンは、非同期を非同期に名前変更します。

25
ryanmehta

セロリは、コンブとビリヤードの要件を特定のバージョンに固定していません。次のものが必要です。

billiard>=3.5.0.2,<3.6.0
kombu>=4.0.2,<5.0

https://github.com/celery/celery/blob/v4.1.0/requirements/default.txt

kombu 4.2.0は重大な変更を加えてリリースされ、以前のバージョンのセロリは自動的にインストールされます。

Celeryは特定のバージョンを固定しないので、引き続きcelery 4.1.0を使用する場合は、以下に固定する必要があります。

kombu==4.1.0
billiard==3.5.0.2
12
John

pip install --upgrade 'celery>=4.2.0rc4'

kombu==4.2.0asyncの名前をasynchronousに変更し、セロリはcelery==4.2.0rc4で修正しました。

したがって、セロリを4.2.0rc4にアップグレードする必要があります。

参照: https://github.com/celery/celery/commit/c8ef7ad60b72a194654c58beb04a1d65cd0435ad

7
吴毅凡

それが問題であり、実際にはコンブバージョンでした。

Kombuの2つのバージョンをインストールしました。4.2.0を'appuser'ユーザーとして使用し、ワーカーを起動しようとしました。4.1.0は'root'としてインストールしました。 'root'としての4.1.0は機能しますが、他のユーザーは機能しませんでした。

'appuser'ユーザーアカウントからkombu 4.2.0を削除しました(pip uninstall kombuそのユーザーとして)、システム全体にインストールされたパッケージを使用し、セロリの労働者はそのアカウントで正しく動作しました。

実際に壊れているのはkombu 4.2.0であることを確認するために、システム全体の4.1.0バージョンを削除し、pipに最新バージョンをインストールさせます。これは4.2.0として取得され、Celeryワーカーはnoロングスタート。私はそれをアンインストールし、pipに4.1.0をインストールするよう強制しました(pip install kombu == 4.1.0)、ワーカーは正しく動作しました。

別のチェックとして、私は自分のMacに行き、最初にこのコードを作成/テストし、pip:4.1.0によってそこにインストールされたkombuバージョンをチェックしました。 MacとPi3でpipがkombuの4.1.0バージョンをインストールし、ODROID-C2でpipが4.2.0バージョンをインストールした理由はわかりません。機会があればもっと掘りますが、今はうまくいきます。

6
DYoung

簡単なハック修正は、結果のバックエンドを無効にすることです:

# CELERY_RESULT_BACKEND = 'redis://redis'
0
jmoz