2013-09-25 81 views
1

我試圖使用mutltiprocessing包來使用函數中的多個CPU。當我在一個函數之外運行一個玩具例子時,它會在四分之一秒內運行,沒有任何問題(見下文)。Python多處理:在函數中調用pool.map

from multiprocessing import Pool 
import time 

start = time.clock() 

def f(x): 
    return x*x 

if __name__ == '__main__': 
    with Pool(processes=7) as pool:  
     result = pool.map(f, range(1000)) 



print(time.clock() - start) 

然而,當我適應了相同的代碼輸入功能(見下文),它打印True,表明__name__ == '__main__',但隨後將永遠運行下去,永不返回結果。我在Windows 7上運行Python 3.3。

from multiprocessing import Pool 
import time 

start = time.clock() 

def f(x): 
    return x*x 

def testfunc(r): 
    if __name__ == '__main__': 
     print(True) 
     with Pool(processes=7) as pool:  
      result = pool.map(f, range(r)) 

    return result 

result = testfunc(1000) 
print(time.clock() - start) 
+0

嘗試把'如果__name__ == '__main __''塊的功能外,在調用'testfunc'左右。 – BrenBarn

+0

在所有提到的三個代碼片段(上面2個答案中的1個)中,「with」的用法給出了一個錯誤。它是''AttributeError:__exit__''。我什至不能得到第一個例子跑...我錯過了什麼? –

回答

4

您在錯誤的地方使用if __name__ == '__main__'

from multiprocessing import Pool 
import time 

start = time.clock() 

def f(x): 
    return x*x 

def testfunc(r): 
    print(True) 
    with Pool(processes=7) as pool:  
     result = pool.map(f, range(r)) 
    return result 

if __name__ == '__main__': 
    result = testfunc(1000) 
    print(time.clock() - start) 

根據multiprocessing - Programming guidelines

Safe importing of main module

Make sure that the main module can be safely imported by a new Python interpreter without causing unintended side effects (such a starting a new process).

... one should protect the 「entry point」 of the program by using if __name__ == '__main__': as follows:

+0

你測試過這段代碼嗎?它給出了一個錯誤,說''AttributeError:__exit__'' –

+0

@PavithranIyer,你正在使用哪個版本的Python?我在發佈時使用Python 3.3測試了這一點。我認爲你使用的是Python 2.x. 'multiprocessing.Pool'不是一個上下文管理器。 http://asciinema.org/a/18325 – falsetru

+0

@PavithranIyer,如果您使用Python 2.x,請嘗試以下操作:http://pastebin.com/hHKbgaSc(不使用上下文管理器) – falsetru

相關問題