2015-06-03 120 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)