Python:多处理池中的产量

Shi*_*tan 4 python yield multiprocessing

我要并行化一个涉及一定"收益"的函数.这只是我要研究的整个程序的简单复制品,但总结了我面临的问题.在这里,我尝试理解我的项目的多处理,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()
Run Code Online (Sandbox Code Playgroud)

Vin*_*ent 6

当调用包含yield语句的函数时,它实际上不会运行代码,而是返回生成器:

>>> p = parallel(1, 2, 3)
>>> p
<generator object parallel at 0x7fde9c1daf00>
Run Code Online (Sandbox Code Playgroud)

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

>>> next(p)
([10000], 6)
>>> next(p)
(6, [10000])
Run Code Online (Sandbox Code Playgroud)

在您的情况下,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)
Run Code Online (Sandbox Code Playgroud)