redis - 尝试从 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>
解决方案
如果您的工作进程应该返回 utf8 编码的响应,那么这可能不是缺少依赖项,而是不同的库版本或服务器上设置的 celery 工作进程有问题。
celery 返回与 utf-8 编码不兼容的错误消息存在一个已知问题,尽管规范说应该如此。在旧版本(在较新版本中已修复)中也有多个使用错误或不匹配编码的记录错误,尤其是在处理 json 时。
不幸的结果是您看到报告抱怨结果的第一个字符 (0x80) 无效,而不是看到返回的实际错误(或错误编码的数据)。
要对此进行调试,请激活足够的日志记录以查看返回的实际数据或错误结果,然后从那里开始工作。
或者,您可以将入站数据视为二进制,而不是 utf8,这将允许字节毫发无损地通过。它们仍然无法作为 utf8 或 ascii 字符读取,但至少您会收到它们。
您可以在此处查看其他人处理非 utf8 数据的多种方式。
推荐阅读
- c - 从 C 中的多个值创建地址
- ios - 我如何为我的按钮创建一个约束,所以它不会弄乱它的大小
- flutter - Flutter - TextFormField - 从 TextInputFormatter 调用 Future
- javascript - 为 ReactJS 或 Webpack 问题重写 Javascript 函数?
- web-scraping - 如何使用网页抓取识别哪些内部网址是广告?
- r - 如何使用 plotly 绘制微分方程
- asp.net-mvc - MVC5 Cookie和chrome相同的站点问题
- java - 这个循环有什么问题?- 安卓工作室
- xamarin - 如何在 Xamarin 中的 CollectionChange 事件中获取滚动当前位置?
- r - 如何在元数据中更改 R 脚本作者姓名