使用concurrent.futures时遭遇BrokenProcessPool错误求助
问题原因及解决方法
你的问题出在Windows系统下多进程代码缺少if __name__ == '__main__':保护。
Windows系统的多进程采用spawn方式创建子进程,而非类Unix系统的fork机制。这意味着每个子进程都会重新导入主模块并执行其中的全部代码。如果没有if __name__ == '__main__':保护,子进程会重复执行创建ProcessPoolExecutor的逻辑,导致进程池内部崩溃,最终抛出BrokenProcessPool错误。
修复后的代码
from concurrent import futures import os def task(n): return (n, os.getpid()) if __name__ == '__main__': ex = futures.ProcessPoolExecutor(max_workers=2) results = ex.map(task, range(5, 0, -1)) for n, pid in results: print('ran task {} in process {}'.format(n, pid))
为什么这样能解决问题
if __name__ == '__main__':是Python的标准入口判断逻辑,只有当脚本作为主程序直接运行时,才会执行块内的代码。子进程导入主模块时,__name__会被设为子进程的模块名而非__main__,因此不会重复创建进程池,从根源避免了进程崩溃的问题。
其他示例运行正常可能是因为它们未使用多进程机制,或者已经包含了这个必要的保护逻辑。
内容的提问来源于stack exchange,提问作者mayankkaizen
相关产品推荐
相关产品推荐

