Celery启动触发TypeError: unhashable type: 'dict'错误求助
Celery启动报错TypeError("unhashable type: 'dict'")解决办法
核心问题分析
报错栈最终指向strategy = strategies[type_],此处type_被解析为字典而非预期的任务类型字符串,导致无法作为字典键使用,触发"unhashable type: 'dict'"错误。该问题通常由队列遗留异常消息、依赖版本不兼容或序列化配置错误引发。
解决步骤
1. 清理RabbitMQ异常任务消息
旧队列中可能遗留了格式错误的任务消息(比如之前错误代码发送的异常消息),worker启动后会自动消费这些消息导致报错:
# 列出当前所有队列 rabbitmqctl list_queues # 删除目标队列(默认Celery队列为celery,替换为你的队列名) rabbitmqctl delete_queue celery
2. 固定Celery及依赖版本
版本不兼容是常见诱因,尝试安装经过验证的稳定版本组合:
pip install celery==5.2.7 kombu==5.2.0 amqp==5.1.1
3. 检查并修正Celery序列化配置
确保消息序列化配置正确,避免解析异常:
from celery import Celery app = Celery('tasks', broker='amqp://guest@localhost//') # 配置序列化方式为JSON,避免格式解析问题 app.conf.update( task_serializer='json', accept_content=['json'], result_serializer='json', )
4. 重建干净的虚拟环境
若依赖存在隐性冲突,直接重建虚拟环境:
# 退出当前虚拟环境 deactivate # 删除旧虚拟环境 rm -rf venv # 创建新虚拟环境并激活 python3 -m venv venv source venv/bin/activate # 安装指定版本依赖 pip install celery==5.2.7
内容的提问来源于stack exchange,提问作者ShiraW
相关产品推荐
相关产品推荐

