簡體   English   中英

Python:多處理池中的產量

[英]Python: Yield in multiprocessing Pool

我要並行化一個涉及一定“收益”的函數。 這只是我要研究的整個程序的簡單復制品,但總結了我面臨的問題。 在這里,我試着理解我的項目的多處理,apply_async和yield在這個例子中,我使用了multiprocessing.pool並使用了apply_async進行並行化。 我在“並行”函數中放了一些打印語句,但它們沒有打印出來。 當我用return返回yield時,print語句會被反映出來。 我不確定收益的性質。 我知道它是一個發生器,只能在返回后使用一次。 請告知如何使其正常工作。

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()

當調用包含yield語句的函數時,它實際上並不運行代碼,而是返回生成器:

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

然后,當需要下一個值時,代碼將一直運行,直到產生一個值:

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

在您的情況下, results包含10個異步創建的生成器,但它們從未實際運行過。

如果要使用生成器,可以稍微更改代碼以定位從生成器創建列表的函數:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM