Python使用ProcessPoolExecutor报BrokenProcessPool错误如何解决
报错原因
- Python多进程默认在Windows、macOS 10.14+版本使用
spawn启动模式,子进程启动时需要重新导入父进程的主模块获取要执行的函数。Jupyter Notebook的交互式上下文中定义的函数(如示例中的dummy)没有存储在可导入的独立模块中,子进程无法正常获取目标函数,启动时直接崩溃,最终触发BrokenProcessPool报错。 - Jupyter环境中运行单元格时,
if __name__ == '__main__'的判断逻辑生效机制和普通.py脚本不一致,也会导致多进程初始化异常。
修复方案
- 方案1(全平台兼容,最推荐):将需要被进程池调用的工作函数存放到独立的
.py文件中再导入使用。比如新建worker.py文件写入以下内容:
def dummy(x): return x**(1/200)
再在Jupyter单元格中修改代码为:
import concurrent.futures from worker import dummy def main(): with concurrent.futures.ProcessPoolExecutor() as executer: x =[1,2,3,4,5,6] future = executer.map(dummy,x) for result in future: print(result) if __name__ == '__main__': main()
- 方案2(仅支持Linux、macOS):显式指定多进程启动模式为
fork,在代码最开头添加两行配置即可,注意该配置整个Notebook生命周期内仅需运行一次,重复执行会报错:
import multiprocessing multiprocessing.set_start_method("fork")
添加后原代码无需其他修改即可正常运行。
- 方案3(全平台兼容):将完整代码复制到独立的
.py文件中,通过终端执行python 文件名.py,原代码无需任何修改即可正常运行。
内容的提问来源于stack exchange,提问作者stochastic learner
相关产品推荐
相关产品推荐

