首页 > 解决方案 > 尝试从 Redis 队列读取结果的 Celery 中的 Unicode 解码错误

问题描述

尝试通过 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>

标签: rediscelerypython-3.5python-unicodekombu

解决方案


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

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

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

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

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

您可以在此处查看其他人处理非 utf8 数据的多种方式。


推荐阅读