Celery AttributeError: асинхронная ошибка - PullRequest
0 голосов
/ 21 мая 2018

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: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

Однако когдаЯ пытаюсь запустить работника Celery на 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

Из Kalro ODROID я могу подключитьсяк экземпляру RabbitMQ на хосте с именем c2 с использованием скрипта Python Pika, и mysql с этого устройства работает и на машине c2. Я обнаружил похожие ошибки, ни одно из этих решений не помогло мне.

Версия Celeryустановленный на ODROID-C2 через пункт:

celery --version
4.1.0 (latentcall)

Ответы [ 6 ]

0 голосов
/ 11 февраля 2019

Быстрое исправление взлома - отключение бэкэнда результата:

# CELERY_RESULT_BACKEND = 'redis://redis'
0 голосов
/ 24 мая 2018

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

0 голосов
/ 22 мая 2018

Мы отсортировали, просто обновив до сельдерея == 4.1.1

Похоже, что последний выпуск для 4.1.X отсортировал изменение имени модуля на Kombu

0 голосов
/ 22 мая 2018

Сельдерей не привязывает свои требования к комбу и бильярду к конкретным версиям.Они требуют следующего:

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
0 голосов
/ 21 мая 2018

В этом была проблема, на самом деле это была версия комбу.

Мне удалось установить 2 версии комбу, 4.2.0 в качестве пользователя 'appuser', которого я пытался запустить рабочим.под, и 4.1.0 как 'root'.4.1.0 как 'root' будет работать, другой пользователь - нет.

Я удалил kombu 4.2.0 из 'appuser' учетной записи пользователя (pip uninstall kombu как этот пользователь), поэтому он будет использовать общесистемный установленный пакет, и работник Celery будет корректно работать под этой учетной записью.

Чтобы убедиться, что на самом деле ломается kombu 4.2.0, я удалил общесистемный 4.1.0, и пусть pip установит последнюю версию, которую он получит как 4.2.0, и работник Celery больше не будет запускать .Я удалил его и заставил pip установить 4.1.0 ( pip install kombu == 4.1.0) , и работник работал правильно.

В качестве еще одной проверки я отправился на свой Mac, где япервоначально написал / протестировал этот код и проверил установленную там версию kombu с помощью pip: 4.1.0.Я не уверен, почему pip на Mac и Pi3 установили версию kombu 4.1.0, а pip на ODROID-C2 установил версию 4.2.0.Я буду копать больше, если у меня будет шанс, но сейчас это работает.

0 голосов
/ 21 мая 2018

Убедитесь, что вы используете Kombu 4.1.0.Последняя версия Kombu переименовывает асинхронный в асинхронный.

...