2016-05-01 60 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()更有意义。但是,当然,我不知道;-) –