Ответ 1
Мы отсортировали, просто обновив сельдерей == 4.1.1
кажется, последняя версия для 4.1.X отсортировала изменение имени модуля на комбу
У меня есть RabbitMQ и Celery, работающие локально на моем Mac (OS/X 10.13.4), следующий код работает локально, когда я запускаю 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:[email protected]/appvhost', \
backend='db+mysql://appuser:[email protected]/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
Однако, когда я пытаюсь запустить работника сельдерей на ODROID-C2, работающем с Kali 2018.2 (с текущими обновлениями, я получаю следующую ошибку при запуске работы с 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 я могу подключиться к экземпляру RabbitMQ на хосте с именем c2, используя скрипт Python Pika, а mysql с этого устройства также работает на машине c2. Я нашел подобные ошибки, ни одно из этих решений не сработало для меня.
Версия для сельдерея, установленная на ODROID-C2 через трубу:
celery --version
4.1.0 (latentcall)
Мы отсортировали, просто обновив сельдерей == 4.1.1
кажется, последняя версия для 4.1.X отсортировала изменение имени модуля на комбу
Убедитесь, что вы используете 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 был выпущен с нарушением изменений, и предыдущие версии сельдерея автоматически устанавливают его.
Поскольку сельдерей не связывает конкретные версии, вы должны придерживаться следующего, если вы продолжите использовать сельдерей 4.1.0:
kombu==4.1.0
billiard==3.5.0.2
В этом была проблема, это была фактически версия комбу.
Мне удалось установить 2 версии 'appuser'
, 4.2.0 в качестве пользователя 'appuser'
, который я пытался запустить под рабочим, и 4.1.0 в качестве 'root'
. 4.1.0 как 'root'
будет работать, другой пользователь этого не сделал.
Я удалил kombu 4.2.0 из учетной записи пользователя 'appuser'
(pip 'appuser'
как этот пользователь), поэтому он будет использовать общесистемный установленный пакет, и рабочий Celery работает правильно в этой учетной записи.
Чтобы убедиться в том, что на самом деле это kombu 4.2.0, который был сломан, я удалил общесистемную версию 4.1.0 и позволил pip установить последнюю версию, которую он получит как 4.2.0, и рабочий Celery больше не будет запускаться. Я удалил его и принудительно выполнил установку 4.1.0 (pip install kombu == 4.1.0), и рабочий работал правильно.
В качестве еще одной проверки я пошел на свой Mac, где я изначально написал/протестировал этот код, и проверил версию kombu, установленную там, на pip: 4.1.0. Я не уверен, почему pip на Mac и Pi3 установили версию комбу 4.1.0, а pip на ODROID-C2 установили версию 4.2.0. Я буду копать больше, если у меня появится шанс, но теперь это работает.
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