Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:多处理池中的产量_Python_Multiprocessing_Yield - Fatal编程技术网

Python:多处理池中的产量

Python:多处理池中的产量,python,multiprocessing,yield,Python,Multiprocessing,Yield,我必须并行化一个函数,它涉及到一定的“产量”。这只是我要处理的整个程序的简单复制品,但总结了我面临的问题。在这里,我试图了解多处理,应用异步和产量为我的项目 在本例中,我使用了multiprocessing.pool并使用apply\u async来并行化。我在“parallel”函数中放入了一些print语句,但它们没有被打印出来。 当我用return替换yield时,print语句得到了反映。我不确定收益的性质。我知道这是一台发电机,它返回后只能使用一次。请就如何使其工作提供建议 impor

我必须并行化一个函数,它涉及到一定的“产量”。这只是我要处理的整个程序的简单复制品,但总结了我面临的问题。在这里,我试图了解多处理,应用异步和产量为我的项目 在本例中,我使用了multiprocessing.pool并使用apply\u async来并行化。我在“parallel”函数中放入了一些print语句,但它们没有被打印出来。 当我用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>
在您的例子中,
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)

我不明白这有什么帮助,因为我的问题很相似,我想并行化的函数实际上是生成器。我的理解正确吗?将它转换成一个列表只会使它运行每次迭代,这将花费与在for循环中使用生成器相同的时间长度?
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)