Ошибка декодирования Unicode в Celery при попытке прочитать результаты из очереди Redis
Попытка выполнить несколько простых задач через сельдерей. Заголовок рабочего файла выглядит так
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 ответа
Если ваш рабочий процесс должен возвращать ответы в кодировке utf8, то это, скорее всего, не отсутствующая зависимость, а либо другая версия библиотеки, либо что-то не так с рабочим процессом celery, настроенным на вашем сервере.
Существует известная проблема с сообщениями об ошибках возврата сельдерея, которые не совместимы с кодировкой utf-8, хотя спецификации говорят, что они должны быть. Есть также множество задокументированных ошибок в более старых версиях (исправленных в более новых версиях), которые использовали неправильные или несовпадающие кодировки, особенно при обработке json.
К сожалению, вы видите отчет с жалобой на недопустимость первого символа результата (0x80), а не возвращаемую фактическую ошибку (или неверно закодированные данные).
Чтобы отладить это, активируйте достаточно регистрации, чтобы увидеть фактические данные или возвращаемый результат ошибки, и работайте оттуда.
В качестве альтернативы вы можете обрабатывать входящие данные как двоичные, а не как utf8, что позволило бы байтам проходить без потерь. Они по-прежнему не будут читаться как символы utf8 или ascii, но, по крайней мере, вы их получите.
Вы можете увидеть ряд способов, которыми другие люди неожиданно обработали данные не-utf8 здесь.
Одна из возможностей заключается в том, что кодировка по умолчанию для python отличается между вашим локальным сервером и сервером.
Вы можете получить кодировку по умолчанию, выполнив
python -c 'import sys; print(sys.getdefaultencoding())'
на вашем локальном и сервере.
Если оба не совпадают, наиболее общий способ изменить кодировку по умолчанию - это переменная окружения
export PYTHONIOENCODING=new_encoding
Но это зависит от окружающей среды.
Ниже ссылка объясняет больше идей для изменения кодировки.