如何调试rq入队的函数?VS Code中debugpy断点失效求助
解决RQ队列函数无法触发VS Code断点的问题
问题分析
核心矛盾在于:执行队列任务的RQ Worker是独立进程(或由Worker进程fork出的子进程),而你的调试器仅attach到了提交任务的主进程。debugpy无法自动将调试会话继承到fork后的进程或独立Worker进程,因此队列内函数的断点无法触发。
解决方案
需要单独为RQ Worker进程配置debugpy调试,具体步骤如下:
1. 用debugpy启动RQ Worker
停止原有的普通RQ Worker启动命令,改用debugpy启动并指定独立调试端口(避免和主进程冲突):
# 替换为你的Redis地址和目标队列名称 python3 -m debugpy --listen 0.0.0.0:5679 rq worker -u redis://redis:6379/0
2. 新增VS Code调试配置
在.vscode/launch.json中添加针对Worker进程的远程attach配置:
{ "configurations": [ // 保留原主进程调试配置 { "name": "Python: Remote Attach", "type": "python", "request": "attach", "connect": { "host": "0.0.0.0", "port": 5678 }, "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "/app" } ], "justMyCode": true }, // 新增Worker进程调试配置 { "name": "Python: RQ Worker Remote Attach", "type": "python", "request": "attach", "connect": { "host": "0.0.0.0", "port": 5679 }, "pathMappings": [ { "localRoot": "${workspaceFolder}", "remoteRoot": "/app" } ], "justMyCode": true } ] }
3. 清理代码冗余调试逻辑
删除worker_function内的debugpy相关代码,Worker进程已由debugpy启动,会自动处理调试连接:
import rq def worker_function(): pass # 此处断点现在可正常触发 def parent_function(rq_queue: rq.Queue): rq_queue.enqueue(worker_function) # 主进程断点依然正常工作
4. 启动调试流程
- 用debugpy启动提交任务的主脚本:
python3 -m debugpy --listen 0.0.0.0:5678 script.py - 用debugpy启动执行任务的RQ Worker:
python3 -m debugpy --listen 0.0.0.0:5679 rq worker -u redis://redis:6379/0 - 在VS Code中按需attach到主进程或Worker进程(仅调试队列函数的话,attach到Worker进程即可)。
额外说明
如果使用SimpleWorker,需在启动时明确指定,避免Worker fork子进程,进一步提升调试稳定性:
python3 -m debugpy --listen 0.0.0.0:5679 rq worker --worker-class=rq.SimpleWorker -u redis://redis:6379/0
内容的提问来源于stack exchange,提问作者TommyD
相关产品推荐
相关产品推荐

