2015-06-03 96 views
3

我必须并行化一个涉及某个“产量”的函数。这只是我必须处理的整个程序的一个简单复制品,但总结了我所面临的问题。在这里,我尝试了解我的项目的多处理,apply_async和yield 在这个例子中,我使用了一个multiprocessing.pool,并使用了apply_async来并行化。我在“并行”函数中添加了一些打印语句,但它们没有打印出来。 当我用return来替换yield时,print语句得到了体现。我不确定收益的性质。我知道它是一台发电机,只能在返回后使用一次。请告知如何使这项工作。Python:多处理产量池

import multiprocessing as mp 
results=[] 

def parallel(x, y, z): 
    print "aim in parallel" 
    count=0 
    result=[] 
    for line in range(10000): 
     count+=1 
    result.append(count) 
    p=x**3+y+z 
    print " result" 
    print result 
    print p 
    if p > 0: 
     return result 
#  yield result, p 
#  count += 1 
#  yield p, result 
#  count += 1 

def collect_results(result): 
    print "aim in callback" 
    results.append(result) 
    #print results 


def apply_async_with_callback(): 
    pool = mp.Pool(processes=10) 
    r = range(10) 
    [pool.apply_async(parallel, args=(2,5, 7),callback=collect_results) for i in r ] 
    pool.close() 
    pool.join() 
    print "length" 
    print len(results) 
    print results 

if __name__ == "__main__": 
    apply_async_with_callback() 

回答

3

当含有yield声明一个函数被调用,它实际上并没有运行的代码,但返回,而不是一台发电机:

>>> p = parallel(1, 2, 3) 
>>> p 
<generator object parallel at 0x7fde9c1daf00> 

然后,需要下一个值时,该代码将运行直到值产生:

>>> next(p) 
([10000], 6) 
>>> next(p) 
(6, [10000]) 

在你的情况,results包含已创建异步发电机10,但他们从来没有去过ACTU盟友跑。

如果你想使用一台发电机,你可以改变你的代码位的目标,创造了发电机列表的功能:

def parallel2(x, y, z): 
    return list(parallel(x, y, z)) 

def collect_results(lst): 
    results.extend(lst) 

def apply_async_with_callback(): 
    pool = mp.Pool() 
    for _ in range(10): 
     pool.apply_async(parallel2, args=(2, 5, 7), 
         callback=collect_results)