使用ProcessPoolExecutor时出现BrokenProcessPool错误的原因咨询
问题原因分析
这个BrokenProcessPool错误的核心原因和Windows系统下多进程的spawn启动模式直接相关:
- Windows系统中,
ProcessPoolExecutor默认使用spawn模式创建子进程,该模式会重新导入主脚本作为__main__模块。 - 你自定义的
func函数定义在主脚本的全局作用域中,当子进程尝试反序列化这个函数时,会尝试从__main__模块加载它。但子进程重新运行主脚本时,多进程环境下的模块导入机制差异会导致函数的序列化/反序列化出现异常,进而引发子进程意外终止。 - 而
np.sum是numpy库的内置函数,它定义在numpy的专属模块中,而非主脚本的__main__模块,子进程可以正常导入numpy并获取该函数,因此不会出现问题。
解决方案
将自定义函数放到单独的Python模块中,比如创建utils.py文件:
# utils.py import numpy as np def func(x): return x + 1
然后在主脚本中导入该函数:
from concurrent.futures import ProcessPoolExecutor import numpy as np from utils import func def main(): data = np.arange(100).reshape(10,-1) with ProcessPoolExecutor() as executor: for result in executor.map(func, data): print(result) if __name__ == '__main__': main()
这样子进程可以从独立模块中正确导入func,避免了__main__模块导入带来的兼容性问题。
内容的提问来源于stack exchange,提问作者Giwon Karai
相关产品推荐
相关产品推荐

