2014-09-04 41 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回調的結果,並阻止池正確關閉。