Celery尝试从Redis队列读取结果时出现Unicode解码错误

时间:2019-01-19 05:32:41

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

尝试通过芹菜运行一些简单的任务。 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(通用)#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>

2 个答案:

答案 0 :(得分:2)

如果您的工作进程应该返回utf8编码的响应,则可能不是缺少相关性,而是其他版本的库或服务器上设置的celery工作进程出错。

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

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

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

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

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

答案 1 :(得分:1)

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

您可以通过执行以下操作获取默认编码

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

在您的本地服务器上。


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

export PYTHONIOENCODING=new_encoding

但这取决于环境。

下面的链接介绍了更改编码的更多方法。

c.f。 Changing default encoding of Python?