运行django-rq worker持续触发rq.exceptions.DeserializationError报错
问题原因
运行django-rq worker时抛出该异常,核心原因是worker进程启动时没有完成Django应用模型的全量加载,反序列化队列中携带Django模型实例的任务数据时,模型注册表未就绪触发AppRegistryNotReady,最终被RQ包装为DeserializationError抛出。
绝大多数情况都是启动方式错误,跳过了Django初始化流程直接拉起了RQ原生worker。
修复步骤
- 优先使用django-rq封装的官方管理命令启动worker,不要直接调用原生
rq worker命令:
先确认django_rq已经加入项目settings.py的INSTALLED_APPS列表,之后切换到manage.py所在的项目根目录,执行如下启动命令:
该命令会自动完成Django全量应用、模型的加载流程,之后才会启动任务消费循环,从流程上避免模型未就绪就反序列化任务的问题。python manage.py rqworker # 不指定队列名则默认监听default队列,多队列可以空格分隔追加队列名 - 如果是自定义脚本启动worker,必须严格按顺序手动初始化Django环境:
在脚本最顶部优先写入Django初始化逻辑,所有和RQ、项目模型、任务函数相关的导入,都要放在初始化完成之后,示例:
顺序错误(比如先导入RQ或模型再执行# 脚本最开头先写初始化逻辑 import os os.environ.setdefault("DJANGO_SETTINGS_MODULE", "替换为你的项目settings模块的导入路径") import django django.setup() # 这行执行完成后,Django模型注册表才会就绪 # 初始化完成后再导入其他依赖 from rq import Worker, Connection # 后续自定义worker启动逻辑django.setup())依然会触发相同报错。 - 配置修正后仍重复报错的,清空队列积压的脏任务:
之前错误启动阶段可能在Redis队列中写入了序列化异常的坏数据,worker拉取到这类历史任务时依然会抛反序列化错误。可以执行python manage.py rqempty <队列名>清空指定队列的积压任务,也可以手动连接Redis删除对应队列的键,之后重启worker即可。
内容的提问来源于stack exchange,提问作者nadermx
相关产品推荐
相关产品推荐

