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)
Celery == 4.1.1に更新するだけでソートしました
4.1.Xの最新リリースは、kombuのモジュール名の変更を整理したようです。
Kombu 4.1.0を使用していることを確認してください。 Kombuの最新バージョンは、非同期を非同期に名前変更します。
セロリは、コンブとビリヤードの要件を特定のバージョンに固定していません。次のものが必要です。
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
pip install --upgrade 'celery>=4.2.0rc4'
kombu==4.2.0
はasync
の名前をasynchronous
に変更し、セロリはcelery==4.2.0rc4
で修正しました。
したがって、セロリを4.2.0rc4にアップグレードする必要があります。
参照: https://github.com/celery/celery/commit/c8ef7ad60b72a194654c58beb04a1d65cd0435ad
それが問題であり、実際にはコンブバージョンでした。
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バージョンをインストールした理由はわかりません。機会があればもっと掘りますが、今はうまくいきます。
簡単なハック修正は、結果のバックエンドを無効にすることです:
# CELERY_RESULT_BACKEND = 'redis://redis'