使用Redis/python-rq/rq-scheduler配置定时任务触发NoRedisConnectionException
解决rq-scheduler的NoRedisConnectionException问题
你遇到的问题根源在于Scheduler初始化时没有正确获取到Redis连接。虽然你传入了配置好的Queue,但rq-scheduler内部的部分逻辑需要直接访问Redis连接,仅通过queue传递可能无法满足要求。下面是具体的修复方案和代码调整建议:
核心修复:显式传递Redis连接给Scheduler
先创建一个共享的Redis连接实例,同时传递给Queue和Scheduler,确保两者使用同一个连接实例:
from datetime import timedelta from redis import Redis from rq import Queue from rq_scheduler import Scheduler from flask import Flask, jsonify app = Flask(__name__) # 1. 创建统一的Redis连接实例 redis_conn = Redis(host=BaseConfig.REDIS_HOST, port=BaseConfig.REDIS_PORT) # 2. 使用该连接初始化Queue rq = Queue(connection=redis_conn) # 3. 同时将连接传入Scheduler(与queue参数配合) rqs = Scheduler(queue=rq, connection=redis_conn) def hello_world(): print("hello world") @app.route("/queue/test", methods=["GET", "POST"]) # 注意参数是复数methods,不是method def test_queue(): job = rqs.enqueue_in(timedelta(seconds=30), func=hello_world) return jsonify(job_id=job.id) # job.id是属性,不是方法,无需加括号()
你代码里的两个小错误
除了连接问题,你的代码还有两个容易忽略的细节错误:
@app.route的参数是methods(复数形式),你写的method会导致路由无法正确响应POST请求;job.id是属性而非可调用方法,原来的job.id()会触发AttributeError,需要去掉括号。
额外注意事项
启动rq-scheduler worker时,要确保命令参数和代码中的Redis配置一致,示例启动命令:
rqscheduler --host <你的REDIS_HOST> --port <你的REDIS_PORT>
如果Redis设置了密码,还需要添加--password <你的REDIS_PASSWORD>参数。
内容的提问来源于stack exchange,提问作者user1960118
相关产品推荐
相关产品推荐

