导入模块中的Python多进程无法运行问题排查
问题原因
Windows下Python的多进程采用spawn模式启动子进程,启动时会重新导入相关模块,因此通常在主启动模块里用if __name__ == '__main__'包裹多进程启动代码,防止无限递归。
但你在tmp1.py的calculate函数内部加了这个判断:当tmp2.py作为主程序运行时,tmp1.py的模块名是tmp1而非__main__,所以判断分支里创建进程池、执行任务的代码完全没运行,直接返回了空列表。
而把代码复制到tmp2.py时,主模块的__name__是__main__,判断分支正常执行,自然能得到正确结果。
修复方法
删掉calculate函数里的if __name__ == '__main__'判断,这个判断只应该放在主启动模块的入口处,不是被导入模块的函数内部。
修改后的tmp1.py代码:
from multiprocessing import Pool def mul2(x): return [a*2 for a in x] def calculate(func, x): r = [] p = Pool(2) r.append(p.map(func, x)) p.close() p.join() return r
tmp2.py保持原样即可,运行后会输出预期的[[[2, 4, 6], [8, 10, 12], [14, 16, 18]]]。
如果需要直接运行tmp1.py测试,可以在文件末尾添加主模块判断的测试代码:
if __name__ == '__main__': test_input = [[1,2],[3,4]] print(calculate(mul2, test_input))
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

