Python中的多进程 - pool.join()后进程未停止
我写了一段简单的代码来加速我的函数f,下面是一个使用两个CPU的例子:
if __name__ == '__main__':
pool = Pool(processes = 2)
f0_list = pool.map(f,range(nlocs))
pool.terminate()
pool.join()
final_f0 = np.sum(f0_list,axis=0)
f0_final = final_f0[0:121] # here I get the error message: 'final_f0 not defined'
我的结果'final_f0'是正确的。不过,我原本以为在执行pool.join()之后,所有的进程都会结束,但似乎并不是这样,因为:
- 我发现还有一个CPU在后台运行,尽管final_f0已经有效返回,但它似乎没有停止?
- 当我尝试像上面描述的那样处理'final_f0'时,出现了错误信息。这个错误信息打印了很多次,就好像Python在不断重复运行这个脚本。
有什么建议吗?
1 个回答
3
你遇到关于 f0_final
的错误,是因为你没有把那行代码放在 if __name__ == "__main__":
这个保护语句里面。在Windows系统上,multiprocessing
需要在它创建的子进程中重新导入你的 __main__
模块,这意味着你模块顶层的所有代码都会在父进程和所有子进程中执行。
这行代码
f0_final = final_f0[0:121]
是在模块的顶层定义的,所以它会在所有子进程中执行。然而,放在 if __name__ == "__main__":
保护语句下面的代码就不会执行,所以你尝试对 final_f0
进行切片的操作会失败,这样所有的子进程都会失败。这会导致你的主进程无法得到 map
调用的结果,也会阻止进程池正常关闭。