2014-09-04 83 views
2

我已经写了一段简单的代码,以加快我的函数f pool.join()之后不停止,使用2个CPU的例子如下所示:多重处理在Python - 过程

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一遍又一遍地运行脚本。

有什么建议吗?

+0

你说你有一个CPU在后台运行 - 你确定CPU的使用实际上是由Python进程引起的吗? ''''''''''''''''''在您调用'join'之前'''''''''''''''''''''''''至于#2,我们需要看到更多的代码,以及获得的实际回溯,以提供帮助。 – dano 2014-09-04 14:12:07

+0

是的,我很确定它是Python,因为我停止了在我的机器上运行的其他程序来检查。至于我在f0_final上的操作,这很简单,我只是试图保留前122个值 - 我更新了我的问题,并提供了更多的细节。 – Neodyme 2014-09-04 14:48:48

+0

你使用的是Windows吗?您应该能够检查任务管理器,以确切了解*使用CPU的过程,以及在终止池后查看是否实际上运行了多个python进程。 – dano 2014-09-04 15:00:26

回答

2

你会得到关于f0_final的错误,因为你没有在if __name__ == "__main__":守卫中保留那条线。在Windows上,multiprocessing需要在您生成的子进程中重新导入您的__main__模块,这意味着模块顶级的所有内容都将在父进程中的所有子级中执行。

线

f0_final = final_f0[0:121] 

是在模块的顶层定义,所以它就会在你的所有子进程执行的,但是,if __name__ == "__main__":护卫下的代码没有,所以你尝试采取一片final_f0将失败,这意味着所有的子进程都会失败。这将使您的主进程无法获得map回调的结果,并阻止池正确关闭。