我写了一段简单的代码来加速我的函数 f,下面显示了一个使用 2 个 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 一遍又一遍地运行脚本一样。
有什么建议吗?
最佳答案
您收到有关 f0_final
的错误,因为您没有将该行保留在 if __name__ == "__main__":
守卫中。在 Windows 上,multiprocessing
需要在它生成的子进程中重新导入您的 __main__
模块,这意味着模块顶层的所有内容都将在父进程中执行处理和它的所有 child 。
线
f0_final = final_f0[0:121]
是在模块的顶层定义的,因此它会在您的所有子进程中执行,但是 if __name__ == "__main__":
守卫下的代码不会,所以您的尝试获取 final_f0
的一部分将失败,这意味着所有子进程都将失败。这将使您的主进程无法获得 map
回调的结果,并防止池被正确关闭。
关于python - Python 中的多处理 - 在 pool.join() 之后进程不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25666905/