Python multiprocessing.Pool异常:pool.map冻结、map_async返回不可迭代对象
解决multiprocessing.Pool冻结与报错问题
核心问题原因
在Windows系统中,multiprocessing模块启动子进程时会重新导入主模块。如果没有用if __name__ == '__main__'包裹主执行代码,子进程会再次执行main()函数,进而重复创建进程池,导致进程无限生成、程序冻结无响应。
修复后的基础测试代码
import multiprocessing as mp def double(i): return i * 2 def main(): pool = mp.Pool() results = pool.map(double, [1, 2, 3]) for result in results: print(result) pool.close() # 关闭进程池,停止接收新任务 pool.join() # 等待所有子进程执行完毕 if __name__ == '__main__': main()
关于map_async的错误修复
pool.map_async返回的是MapResult对象,本身不可迭代,必须调用get()方法获取结果列表。同样需要在if __name__ == '__main__'保护下执行,否则仍会冻结:
import multiprocessing as mp def double(i): return i * 2 def main(): pool = mp.Pool() result_obj = pool.map_async(double, [1, 2, 3]) results = result_obj.get() # 获取最终结果列表 for result in results: print(result) pool.close() pool.join() if __name__ == '__main__': main()
额外注意事项
if __name__ == '__main__'是Windows下使用multiprocessing的强制要求,Linux/macOS依赖fork机制可能不会触发该问题,但跨平台代码都应添加该判断。- 使用进程池后,务必调用
close()和join(),确保子进程资源被正确释放,避免产生僵尸进程。 - 如果仍出现冻结,检查是否存在全局变量在子进程中重复初始化,或函数参数/返回值包含不可序列化的对象(
multiprocessing要求传递的数据必须可被pickle序列化)。
内容的提问来源于stack exchange,提问作者MirceaKitsune
相关产品推荐
相关产品推荐

