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

标签 redis celery python-3.5 python-unicode kombu

尝试通过 celery 运行一些简单的任务。工作文件的标题看起来像

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>

最佳答案

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

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

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

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

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

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

关于redis - Celery 尝试从 Redis 队列中读取结果时出现 Unicode 解码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54264352/

相关文章:

redis - 持续连接到redis服务器

javascript - 如何在 JavaScript 中迭代 Redis 排序集(ZADD/ZRANGEBYSCORE)?

c# - StackExchange Redis 在使用异步插入/读取数据时丢失了一些键

python - 带有redis的 celery 中的任务优先级

python - PyInstaller,如何从 pip 安装的外部包中包含数据文件?

python - 无法从 QVBoxLayout 中删除边距

java - Spring Cache 异常 : io. lettuce.core.RedisCommandExecutionException: ERR 'set' 命令的参数数量错误

python - 使用 Django 24 小时后软删除

python - 无需 Celery 或 Redis 即可进行进度跟踪的后台任务

python - 如何使用 Python 3 在 MySQL 中避免 b' 和 UTF-8 文字