当前位置: 首页 > 知识库问答 >
问题:

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

云宾鸿
2023-03-14

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

代码在我的桌面上运行得很好。配置是Python3.6。7和4.15。0-20-generic#21 Ubuntu SMP。

当我尝试在我的暂存服务器上运行相同的东西时(工作节点也在后台运行),上面的第6行抛出以下错误。

kombu.exceptions.DecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte

从日志中,似乎任务被发送到redis队列,被正确执行,但是主进程不能对job结果变量执行任何操作来检索计算的输出。我已经通过ping redis-cli进行了检查,它与PONG相呼应。服务器配置(我认为是相关的)是Python 3.5.2和4.4.0-89-通用#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个答案

宦树
2023-03-14

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

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

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

在您的本地和服务器上。

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

export PYTHONIOENCODING=new_encoding

但这取决于环境。

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

C. F.更改Python的默认编码?

廖招
2023-03-14

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

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

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

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

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

您可以在这里看到其他人处理意外非utf8数据的许多方式。

 类似资料:
  • 我收到一个错误值error:对关闭的文件执行I/O操作。当使用下面的代码时,我的其余代码似乎工作正常,有什么想法吗?

  • 我正在尝试阅读包含以下内容的pdf文件: 如果我打开它,它可以工作,但是如果我尝试使用编解码器.open(文件名,编码=“utf8”,mode=“rb”)来获取unicode字符串,我得到了以下异常: 您知道从此文件的内容中获取 unicode 字符串的方法吗? PS:我使用的是蟒蛇 2.7

  • 问题内容: 我将向芹菜队列添加多个任务,然后等待结果。我有各种各样的想法,我将如何利用某种形式的共享存储(memcached,redis,db等)来实现这一目标,但是,我本以为Celery可以自动处理,但我无法在线找到任何资源。 代码示例 问题答案: 对于 芹菜 > = 3.0 ,使用taskset被弃用赞成组。 在后台启动组: 等待:

  • 这是我的项目结构: 这是我的代码,尝试读取资源文件夹中的文件: 结果都是空的: 将“配置属性”替换为“src/主/资源/配置属性”(带斜杠和不带斜杠)没有任何区别。 其他类似的答案告诉您使用,但这已经是其中一行了。为什么它们都为空,我如何获得资源? 采购订单:

  • 问题内容: 我尝试在我的python脚本中使用matplotlib,但在终端中遇到此错误: 这是我的python代码,我只是写了 我需要做什么? 问题答案: 问题是您当前的工作目录中有一个非ASCII字符。 实际上,这根本不应该是一个问题,但这是由于其他因素的组合: 想要在当前工作目录中查找覆盖默认目录的本地文件。 Python认为您使用的是C语言环境,而不是Ubuntu 14应该默认使用的漂亮的

  • 致命异常:main java.lang.RuntimeException:无法启动活动组件Info{com.example.increative/com.example.increve.comments}:java.lang.nullpointerException 1at android.app.activitythread.performLaunchActivity(activitythrea

  • 我基于Maged M.Michael和Michael L.Scott的《简单、快速、实用的非阻塞和阻塞并发队列算法》中指定的算法实现了一个无锁队列(有关算法,请跳到第4页) 我在上使用了原子操作,如等。 当只在一个线程中使用队列时,一切都很好,但是当从不同的线程中使用它时,我会得到堆栈溢出异常。 不幸的是,我无法追查问题的根源。似乎当一个<code>shared_ptr</code>超出范围时,它

  • 我试图读取xsd文件以验证模式。 我的架构位于位置 我的类读取这个文件也在< code > x/y/z/read schema . Java 中 它们都装在我的罐子里。 我试图在中读取这个文件,如下所示,其中名称是但url返回为null? 我做错什么了吗?