2016-05-31 75 views
0

我在python中使用模塊多處理。在我使用映射函數調用主函數之前,我需要從用戶那裏獲得一些輸入。我的問題是main函數之前的代碼被執行多次,當我打電話的主要功能與pool.map 這個非常簡單的代碼說明我的問題:多呼叫體多核處理python

from multiprocessing import Pool 
result=range(1,5) 
print('start') 
def test(a): 
    print(a+10) 
if __name__=="__main__": 
    pool = Pool(processes=2) 
    pool.map(test,result) 

我的輸出則寫着:

start 
start 
11 
12 
13 
14 
start 

爲什麼測試函數之前的代碼會執行多次?

+2

它不(使用Python 3.5在這裏)。輸出中數字的順序各不相同,所以一切都按預期工作。 – 2016-05-31 12:53:16

+0

但是無論打印的順序如何,開始仍然會打印三次。這是否意味着打印語句和測試函數之前的代碼在只運行一次時會執行三次? 此問題擴展到當我嘗試從用戶那裏獲得一些輸入時,也會多次詢問輸入 – Bruno

+0

我無法再現您的輸出 - 它只會打印「開始」 – DomTomCat

回答

1

它不會爲python 3.4顯示「start」。

不知道你的Python版本,但可能是因爲在每個進程池中,你的文件被導入,然後測試函數被執行。這意味着編寫「全局」的代碼在流程開始時執行一次。

我不得不承認它很奇怪,因爲它意味着子進程不是分叉的,而是自己啓動/導入當前的python腳本。

總之,要尊重PEP8,你應該這樣做更多的是這樣的:

from multiprocessing import Pool 

def test(a): 
    print(a+10) 

def main(): 
    result=range(1,5) 
    print('start') 
    pool = Pool(processes=2) 
    pool.map(test,result) 

if __name__=="__main__": 
    main() 
+0

完美這對我的作品感謝! 這意味着,無論何時我想運行一個包含pool.map的腳本,我都必須將我只想執行一次的所有代碼放入其自己的函數中? – Bruno

+0

是的。一般來說,在文件的「基礎」處不應寫入代碼,只有導入,函數/類定義和尾部 - 如果\ _ \ _ name \ _ \ _ ==「\ _ \ _ main \ _ \ _「---如果該文件將被執行。 – Ronan