Ошибка декодирования Unicode в Celery при попытке прочитать результаты из очереди Redis - PullRequest
0 голосов
/ 19 января 2019

Попытка выполнить несколько простых задач через сельдерей.Заголовок рабочего файла выглядит так:

from celery import Celery, group
from time import sleep
celery = Celery('workerprocess', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')

После прохождения заданий я пытаюсь прочитать результаты, как это.

jobresult=group(signatureList).apply_async()
while not jobresult.ready():sleep(30) #Line 6

Код отлично работает на моем рабочем столе.Конфигурация - Python 3.6.7 и 4.15.0-20-generic # 21-Ubuntu SMP.

Когда я пытаюсь запустить то же самое на моем промежуточном сервере (с рабочим узлом, работающим там же в фоновом режиме), #Line 6 выше выдает следующую ошибку.

kombu.exceptions.DecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

Судя по журналу, задача отправляется в очередь redis, выполняется правильно, но основной процесс не может выполнить какую-либо операцию с переменной jobresult для получения результатов вычислений.Я проверил, пингующий Redis-Cli, и он повторяет PONG.Конфигурация сервера (те, которые я считаю актуальными) - это Python 3.5.2 и 4.4.0-89-generic # 112-Ubuntu.

Поскольку задача уже выполняется на моем локальном рабочем столе, я полагаю, что это вопрос зависимости.Но ошибка не дает никакой подсказки о том, какие другие библиотеки мне следует устанавливать, будь то PIP или apt-get.Я посмотрел, Комбу (не знаю, что он делает, но угадайте что-то важное), и он уже установлен.Так как это решить?

Это вывод из redis-cli из комментария к вопросу.Я не уверен, что это значит, хотя.

127.0.0.1:6379> lrange celery 0 0
(empty list or set)
127.0.0.1:6379>

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Одна из возможностей заключается в том, что кодировка по умолчанию для python отличается для вашего локального сервера и на сервере.

Кодировку по умолчанию можно получить, выполнив

python -c 'import sys; print(sys.getdefaultencoding())'

на локальном компьютере и на сервере.


Если оба не совпадают, наиболее общий способ изменить кодировку по умолчанию - это переменная среды

export PYTHONIOENCODING=new_encoding

Но это зависит от среды.

Ниже ссылка объясняет больше идейизменить кодировку.

cf Изменить кодировку Python по умолчанию?

0 голосов
/ 25 января 2019

Если ваш рабочий процесс должен возвращать ответы в кодировке utf8, то это, скорее всего, не отсутствующая зависимость, а либо другая версия библиотеки, либо что-то не так с рабочим процессом celery, настроенным на вашем сервере.

Существует известная проблема с сообщениями об ошибках возврата сельдерея, которые не совместимы с кодировкой utf-8, хотя спецификации говорят, что так и должно быть.Есть также несколько задокументированных ошибок в более старых версиях (исправленных в более новых версиях), которые использовали неправильные или несовпадающие кодировки, особенно при обработке json.

К сожалению, вы видите сообщение, в котором говорится, что первый символрезультат (0x80) недопустим, вместо того, чтобы видеть возвращаемую фактическую ошибку (или неправильно закодированные данные).

Чтобы отладить это, активируйте достаточно ведения журнала, чтобы увидеть возвращаемые фактические данные или результат ошибки, и работать стам.

В качестве альтернативы вы можете обрабатывать входящие данные как двоичные, а не как utf8, что позволило бы байтам проходить без потерь.Они по-прежнему не будут читаться как символы utf8 или ascii, но, по крайней мере, вы их получите.

Здесь вы можете увидеть несколько способов, которыми другие люди неожиданно обрабатывали данные не-utf8 здесь .

...