Flask集成RQ任务队列报错module 'os' has no attribute 'fork'
报错根因
RQ任务队列原生仅支持POSIX兼容系统(Linux、macOS等),其工作进程默认调用os.fork()派生子进程执行任务。os.fork()是POSIX专属系统调用,Windows系统的Python标准库os模块未实现该方法,因此在Windows原生环境启动rq worker时,一旦拉取到待执行任务就会抛出该属性错误。
当前场景下仅Redis服务部署在WSL中,rq worker实际运行在Windows本地Python虚拟环境,因此必然触发该兼容问题。
可选解决方案
方案1:全量迁移运行环境至WSL(无兼容问题,推荐)
该方案与参考教程的运行环境完全一致,可避免所有Windows兼容类问题:
- 进入WSL Ubuntu子系统,在子系统内完成Python环境配置、安装Flask、RQ、Redis客户端等项目依赖
- 直接在WSL内启动已部署的Redis服务,无需额外配置跨系统网络转发
- 在WSL终端分别执行
rq worker启动任务消费者、执行flask run启动Web服务 - 开发时可通过VSCode的Remote-WSL插件直接打开WSL内的项目目录,开发体验与本地环境无差异。
方案2:使用Windows兼容Worker模式(仅适合本地调试)
如果暂时不迁移环境,可在启动RQ Worker时指定不依赖os.fork()的简单Worker类,启动命令如下:
rq worker --worker-class rq.worker.SimpleWorker
SimpleWorker不会派生子进程,直接在当前Worker进程内同步执行任务,可在Windows环境正常运行。
注意:该模式下Worker同一时间仅能处理单个任务,任务执行期间无法消费新队列消息,仅可用于本地开发调试,禁止用于生产环境。
如果使用方案2,需要额外确认WSL内的Redis服务已关闭仅本地绑定配置、允许来自Windows宿主的网络访问,代码中Redis连接地址需填写WSL的虚拟网卡IP,否则会出现Redis连接失败问题。
内容的提问来源于stack exchange,提问作者KishuInu
相关产品推荐
相关产品推荐

