celery 4.1下报kombu.exceptions.EncodeError: Object of type 'bytes' is not JSON serializable 处理方式...

当在Celery 4.1中遇到'kombu.exceptions.EncodeError: Object of type 'bytes' is not JSON serializable'错误时,可以通过将返回的数据转换为JSON格式来解决。示例代码展示了如何处理这个问题,包括直接解码和使用json.dumps()。通过在任务中应用这些方法,可以避免Celery后台报错。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 
  

#python代码如下

from celery import Celery
import subprocess

 
  

app = Celery('tasks',
broker='redis://localhost',
backend='redis://localhost')

 
  

@app.task
def add(x,y):
print("running...",x,y)
return x+y

 
  

@app.task
def run_cmd(cmd):
cmd_obj=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
return cmd_obj.stdout.read()





[python@qinhan file]$ python Python
3.6.2 (default, Jan 10 2018, 16:15:47) [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux Type "help", "copyright", "credits" or "license" for more information.
>>> import task >>> task.run_cmd('df') #此条命令不会发送到celery后台 b'Filesystem 1K-blocks Used Available Use% Mounted on\n/dev/mapper/centos-root 5232640 2481244 2751396 48% /\ndevtmpfs 490308 0 490308 0% /dev\ntmpfs
### 解析 Celery `NotRegistered` 异常 当遇到 Celery 的 `NotRegistered` 异常时,通常意味着尝试执行的任务未被 Celery 工作者识别或注册。这可能是由于任务模块未能正确加载或是配置不恰当所致。 #### 配置与自动发现任务 确保所有定义了 Celery 任务的模块都被正确导入至应用程序上下文中。对于 Flask 应用程序而言,在启动文件中通过 `autodiscover_tasks()` 方法来指定哪些包下的任务应该被自动检测和注册是非常重要的[^2]: ```python from celery import Celery from celery_tasks import celeryconfig # 定义celery app: 名称 celery_app = Celery("YOYO") # 加载配置 celery_app.config_from_object(celeryconfig) # 自动发现和注册tasks celery_app.autodiscover_tasks([ "celery_tasks.test1", "celery_tasks.test2", "celery_tasks.test3" ]) ``` 上述代码片段展示了如何设置 Celery 来查找特定路径中的任务函数,并将其加入到可用任务列表里。如果忘记这样做,则即使存在这些任务也不会被执行,从而引发 `NotRegistered` 错误。 #### 检查任务装饰器及其位置 确认每一个自定义任务都使用了合适的装饰器标记为 Celery task 函数,并且该装饰器位于正确的命名空间内。例如: ```python @app.task(bind=True, name='my_module.my_task') def my_task(self, arg1, arg2): pass ``` 这里的关键在于确保每个任务都有唯一的名称属性 (`name`) 并绑定到了相应的应用实例上(`@app.task`)。此外,还需注意 Python 文件结构以及相对/绝对导入语句可能影响实际运行环境中的可见性和可访问性。 #### 更新依赖库版本兼容性 有时第三方库之间的版本差异也会引起此类问题。比如 Redis 版本过高可能导致某些情况下出现意外行为,如字符串对象错误地被认为具有字典接口特性而抛出异常。针对这种情况可以考虑调整相关组件的版本号以保持最佳实践建议范围内的组合工作状态[^1]: ```bash pip install redis==2.10.6 ``` 此命令会安装一个较为稳定的旧版 Redis PyClient,有助于排除因 API 变更带来的潜在冲突因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值