【问题标题】:Unicode Decode Error in Celery Trying to Read Results from Redis Queue尝试从 Redis 队列读取结果的 Celery 中的 Unicode 解码错误
【发布时间】:2019-06-13 07:56:43
【问题描述】:

尝试通过 celery 运行一些简单的任务。 workerfile 的头部看起来像

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变量执行任何操作来检索计算的输出。我通过 ping redis-cli 进行了检查,它与 PONG 相呼应。服务器配置(我认为相关的)是 Python 3.5.2 和 4.4.0-89-generic #112-Ubuntu。

由于该任务已经在我的本地桌面上运行,我想这是一个依赖问题。但是该错误并没有提供任何关于我应该安装哪些其他库的线索,无论是使用 PIP 还是 apt-get。我抬头一看,Kombu(不知道它是做什么的,但猜测一些重要的东西)并且它已经安装好了。又怎样 解决这个问题?

这是 redis-cli 对问题的评论的输出。不过,我不确定这意味着什么。

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

【问题讨论】:

  • 您能否从连接到您的代理的 redis-cli 发送以下输出? lrange celery 0 0
  • @2ps 编辑了问题并添加了输出。谢谢。
  • @Della 一个简单的 python 解决方案怎么样? Like this?

标签: redis celery python-3.5 python-unicode kombu


【解决方案1】:

如果您的工作进程应该返回 utf8 编码的响应,那么这可能不是缺少依赖项,而是不同的库版本或服务器上设置的 celery 工作进程有问题。

celery 返回与 utf-8 编码不兼容的错误消息存在一个已知问题,尽管规范说应该这样。在旧版本中也有多个记录在案的错误(在新版本中已修复)使用错误或不匹配的编码,尤其是在处理 json 时。

不幸的结果是您看到报告抱怨结果的第一个字符 (0x80) 无效,而不是看到返回的实际错误(或错误编码的数据)。

要对此进行调试,请激活足够的日志记录以查看返回的实际数据或错误结果,然后从那里开始工作。

或者,您可以将入站数据视为二进制,而不是 utf8,这将允许字节毫发无损地通过。它们仍然无法作为 utf8 或 ascii 字符读取,但至少您会收到它们。

您可以看到其他人处理非 utf8 数据here 的多种方式。

【讨论】:

    【解决方案2】:

    一种可能性是,python 的默认编码在本地和服务器之间是不同的。

    你可以通过做得到默认编码

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

    在您的本地和服务器上。


    如果两者不相同,更改默认编码的最通用方法是环境变量

    export PYTHONIOENCODING=new_encoding
    

    但这取决于环境。

    以下链接解释了更改编码的更多想法。

    参考Changing default encoding of Python?

    【讨论】:

    • 谢谢。但是,shebang 读取 '#!/usr/bin/env python3;#encoding:utf-8' 没有解决这个问题吗?
    • 你的意思是python.org/dev/peps/pep-0263 吗?我认为这是针对源中的原始字符串,而不是文件或网络读取的默认编码。您可以通过执行小脚本来确认它是否有效,其中包含上面的shebang和打印代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多