You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask服务中调用multiprocessing.Pool执行任务偶尔无限挂起问题排查

问题判定

该故障不属于常规业务资源互斥导致的死锁,属于多线程服务环境下使用fork模式创建进程池引发的文件描述符泄漏类假死,是Flask类Web服务中使用multiprocessing.Pool的典型适配问题。

核心触发原因

  • 进程启动模式不兼容:Debian系统下Python 3.8的multiprocessing默认使用fork方式启动子进程,fork会完整复制父进程的所有文件描述符、运行时线程状态。而Flask服务默认运行在多线程WSGI容器中(内置werkzeug、Gunicorn等默认均为多线程模式),多线程进程直接调用fork创建子进程属于高危操作,极易出现资源状态不一致。
  • 文件描述符继承阻塞:multiprocessing.Pool内部依赖管道实现父子进程的任务下发、结果回传逻辑,进程池退出时需要等待所有相关管道的引用被完全释放才会结束流程。当服务内其他工作线程持有了当前进程池管道的文件描述符引用时,即使所有计算任务已经执行完成,主进程的进程池退出逻辑也会持续阻塞等待引用释放,表现为after pool日志始终无法打印。
  • 独立脚本无复现的原因:单进程单线程运行独立脚本时,不存在其他线程持有进程池相关的文件描述符,fork创建的子进程退出后所有管道引用都会正常释放,因此不会出现阻塞问题。

内容的提问来源于stack exchange,提问作者Brian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 03:06:03