Python中的多处理 - 在pool.join()之后进程不会停止

时间:2014-09-04 13:34:15

标签: python multiprocessing

我编写了一段简单的代码来加速我的功能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()之后,所有进程都会结束,但似乎不是这样,因为:

  1. 我仍然有一个CPU在后台运行,即使有效地返回了final_f0,它似乎也没有停止?
  2. 当我尝试削减' final_f0'如上所述,我收到此错误消息。错误消息打印很多次,就像Python一遍又一遍地运行脚本一样。
  3. 有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您收到关于f0_final的错误,因为您没有将该行保留在if __name__ == "__main__":后卫中。在Windows上,multiprocessing需要在其生成的子进程中重新导入__main__模块,这意味着模块顶层的所有内容都将在父进程和< / em>所有孩子。

该行

f0_final = final_f0[0:121]

是在模块的顶层定义的,因此它会在所有子进程中执行,但是if __name__ == "__main__":后卫下的代码没有,所以你试图获取{{1}的一部分将失败,这意味着所有子进程都将失败。这将使您的主要流程无法获得final_f0回调的结果,并阻止池正常关闭。