Redis-RQ无法执行任务求助:Django环境默认队列任务不执行
以下是几个实用的排查和解决方向:
确认worker监听的队列正确
启动worker时务必明确指定队列,执行命令:python manage.py rqworker default。如果启动时没指定队列,部分环境下worker可能不会默认监听default队列。另外用rq info命令查看队列状态,确认任务是否在default队列堆积,以及worker是否已连接到Redis。验证Redis连接配置一致性
检查Django settings中的RQ配置,确保worker和Django使用完全相同的Redis实例:RQ_QUEUES = { 'default': { 'HOST': 'localhost', 'PORT': 6379, 'DB': 0, # 若Redis设置了密码,需添加'PASSWORD': 'your_redis_password' } }重点核对Redis的HOST、PORT、DB编号和密码,任何一项不匹配都会导致worker无法获取队列任务。
排查任务函数本身的问题
先编写一个极简测试任务验证:from rq import job @job def test_rq_task(): print("测试任务执行成功") return "OK"在Django shell中调用
test_rq_task.delay(),然后查看worker的运行日志。如果测试任务也无法执行,说明是环境问题;如果测试任务能执行,说明原任务函数存在异常(比如依赖缺失、代码报错),需要给原任务添加详细日志排查错误。检查worker的运行环境
确保worker和Django项目使用同一个虚拟环境,且worker环境已安装所有依赖包。如果任务中用到了特定库(比如Django ORM、第三方工具),而worker环境未安装,会导致任务执行失败甚至worker崩溃。查看Redis中的任务状态
用redis-cli连接Redis,执行keys rq:job:*查看是否存在任务键,再用hgetall rq:job:<任务ID>查看任务详情,重点检查是否有失败信息。同时用rq info查看失败队列(failed)的任务数量,若有失败任务,执行rq requeue --queue failed重新入队,观察是否能正常执行。
内容的提问来源于stack exchange,提问作者lemueljay

