Celery CRITICAL / MainProcess] Неустранимая ошибка: AttributeError ("объект с плавающей точкой не имеет атрибута" items "",) - PullRequest
0 голосов
/ 15 ноября 2018

Я без проблем запускаю приложение фляги с работником сельдерея и перенаправляю в три отдельных контейнера докеров.

Вот так я начинаю:

celery worker -A app.controller.engine.celery -l info --concurrency=2 --pool eventlet

Сельдерей начинается отлично:

 -------------- celery@a828bd5b0089 v4.2.1 (windowlicker)
---- **** -----
--- * ***  * -- Linux-4.9.93-linuxkit-aufs-x86_64-with 2018-11-15 16:06:59
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         app.controller.engine:0x7f8ba4eb70b8
- ** ---------- .> transport:   redis://redis:6379/0
- ** ---------- .> results:     redis://redis:6379/1
- *** --- * --- .> concurrency: 2 (eventlet)
-- ******* ---- .> task events: ON
--- ***** -----
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery


[tasks]
  . app.controller.engine.do

INFO:engineio:Server initialized for eventlet.
INFO:engineio:Server initialized for threading.
[2018-11-15 15:44:34,301: INFO/MainProcess] Connected to redis://redis:6379/0
[2018-11-15 15:44:34,321: INFO/MainProcess] mingle: searching for neighbors
[2018-11-15 15:44:35,358: INFO/MainProcess] mingle: all alone
[2018-11-15 15:44:35,396: INFO/MainProcess] pidbox: Connected to redis://redis:6379/0.
[2018-11-15 15:44:35,415: INFO/MainProcess] celery@12af03844cd0 ready.

Но при запуске задачи она неожиданно вылетает:

[2018-11-15 15:02:03,224: CRITICAL/MainProcess] Unrecoverable error: AttributeError("'float' object has no attribute 'items'",)
Traceback (most recent call last):
  File "/app/env/lib/python3.6/site-packages/celery/worker/worker.py", line 205, in start
    self.blueprint.start(self)
  File "/app/env/lib/python3.6/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/app/env/lib/python3.6/site-packages/celery/bootsteps.py", line 369, in start
    return self.obj.start()
  File "/app/env/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 317, in start
    blueprint.start(self)
  File "/app/env/lib/python3.6/site-packages/celery/bootsteps.py", line 119, in start
    step.start(parent)
  File "/app/env/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 593, in start
    c.loop(*c.loop_args())
  File "/app/env/lib/python3.6/site-packages/celery/worker/loops.py", line 121, in synloop
    connection.drain_events(timeout=2.0)
  File "/app/env/lib/python3.6/site-packages/kombu/connection.py", line 301, in drain_events
    return self.transport.drain_events(self.connection, **kwargs)
  File "/app/env/lib/python3.6/site-packages/kombu/transport/virtual/base.py", line 963, in drain_events
    get(self._deliver, timeout=timeout)
  File "/app/env/lib/python3.6/site-packages/kombu/transport/redis.py", line 359, in get
    ret = self.handle_event(fileno, event)
  File "/app/env/lib/python3.6/site-packages/kombu/transport/redis.py", line 341, in handle_event
    return self.on_readable(fileno), self
  File "/app/env/lib/python3.6/site-packages/kombu/transport/redis.py", line 337, in on_readable
    chan.handlers[type]()
  File "/app/env/lib/python3.6/site-packages/kombu/transport/redis.py", line 724, in _brpop_read
    self.connection._deliver(loads(bytes_to_str(item)), dest)
  File "/app/env/lib/python3.6/site-packages/kombu/transport/virtual/base.py", line 983, in _deliver
    callback(message)
  File "/app/env/lib/python3.6/site-packages/kombu/transport/virtual/base.py", line 632, in _callback
    self.qos.append(message, message.delivery_tag)
  File "/app/env/lib/python3.6/site-packages/kombu/transport/redis.py", line 149, in append
    pipe.zadd(self.unacked_index_key, time(), delivery_tag) \
  File "/app/env/lib/python3.6/site-packages/redis/client.py", line 2263, in zadd
    for pair in iteritems(mapping):
  File "/app/env/lib/python3.6/site-packages/redis/_compat.py", line 123, in iteritems
    return iter(x.items())
AttributeError: 'float' object has no attribute 'items'

Я не вижу ссылки на мой код в трассировке стека.

Это метод задания:

@celery.task()
def do(module_name, json_input):
    logger.info('____ Running _________________________')
    logger.info('testing ***********************')
    #modules.run(module_name, json_input)

Я прокомментировал вызов моего фактического кода только для того, чтобы убедиться, что я не испортил его с кодом моего модуля ... но он все равно падает.

У кого-нибудь есть идея, что может быть не так или как правильно отладить?

Большое спасибо

Ответы [ 4 ]

0 голосов
/ 23 ноября 2018

Для тех, кто использует докер-поток воздуха, я использовал народ puckel/docker-airflow Просто нужно изменить dockerfile, добавив

   && pip install 'redis>=2.10.5,<3'\

замените celery[redis] только celery, добавив сельдерей во встроенный модуль apache-airflow, т.е.

  && pip install apache-airflow[crypto,celery,postgres,hive,jdbc,mysql]==$AIRFLOW_VERSION 

Обновление: Они также недавно изменили docker-airflow dockerfile, чтобы исправить эту ошибку, см. здесь

0 голосов
/ 16 ноября 2018

Я столкнулся с этой же проблемой сегодня. надеюсь, это будет решено в скором времени в обновлении от Celery. Я вернулся к предыдущей версии.

0 голосов
/ 19 ноября 2018

Недостаточно повторений для комментария:

Эта проблема отслеживается сельдереями в: https://github.com/celery/celery/issues/5175

Ведущий к этому PR: https://github.com/celery/celery/pull/5176

Который был объединен и восстановлен. Потому что приземлилось какое-то другое исправление. Я не уверен, что это исправили. Это больше не актуально для меня.

0 голосов
/ 15 ноября 2018

Проблема заключалась в том, что контейнер my celery загружал новый выпуск пакета redis с pip во время сборки, в конечном итоге с ошибкой или серьезным изменением, которое вылетает, когда celery пытается использовать его при подключении к redis.Эта новая библиотека redis - 3.0.0, и она была выпущена сегодня.

Чтобы решить эту проблему, вы должны указать предыдущую версию в файле require.txt (то есть 2.10.6).

И на самом деле, указание версий пакетов в файле require.txt является хорошей практикой, которая предотвращает подобные проблемы.

...