2016-05-01 59 views
2

我寫了一個使用多處理的python程序。該程序調用8位工作人員,休眠3秒後輸出一個隨機數。我希望程序在3秒鐘內完成,但在24秒內完成,就好像每個工作人員函數是按順序而不是並行計算的一樣。任何想法?我的python多處理程序按順序運行工作程序

import time 
import numpy as np 
import multiprocessing as mp 
import time 
import sys 

def f(i): 
    np.random.seed(int(time.time()+i)) 

    time.sleep(3) 
    res=np.random.rand() 
    print "From i = ",i, "  res = ",res 


if __name__=='__main__': 
    num_workers=mp.cpu_count()  # My CPu has 8 cores. 
    pool=mp.Pool(num_workers) 
    for i in range(num_workers): 
     p=pool.apply_async(f, args=(i,)) 
     p.get() 

    pool.close()   
    pool.join() 

不過,如果我使用過程中,而不是游泳池,我得到預期正確的結果:

import time 
import numpy as np 
import multiprocessing as mp 
import time 
import sys 

def f(i): 
    np.random.seed(int(time.time()+i)) 

    time.sleep(3) 
    res=np.random.rand() 
    print "From i = ",i, "  res = ",res 
    if res>0.7: 
     print "find it" 


if __name__=='__main__': 
    num_workers=mp.cpu_count() 
    pool=mp.Pool(num_workers) 
    for i in range(num_workers): 
     p=mp.Process(target=f,args=(i,)) 
     p.start() 

回答

3

想想你在做什麼這裏:

for i in range(num_workers): 
    p=pool.apply_async(f, args=(i,)) 
    p.get() 

每次通過循環,你發送一些工作到一個池進程,然後(通過.get())你明確地等待該進程返回其結果。所以當然並沒有太多的事情發生。

通常的方式做,這更像是:

workers = [pool.apply_async(f, args=(i,)) for i in range(num_workers)] 
for w in workers: 
    w.get() 

也就是說,你開始爲許多工人去,只要你想,你等待任何人之前。

+0

您也可以使用'pool.map(f,range(num_workers))',它會爲您收集結果。 – Blckknght

+0

@Blckknght,當然 - 我認爲OP的問題是他們真正想要做的事情的大大簡化,並且apply_async()在他們的真實應用中比map()更有意義。但是,當然,我不知道;-) –