【问题标题】:Python: Yield in multiprocessing PoolPython:多处理池中的产量
【发布时间】:2015-08-17 08:23:11
【问题描述】:

我必须并行化一个涉及某个“产量”的函数。这只是我必须处理的整个程序的简单副本,但总结了我面临的问题。在这里,我尝试为我的项目了解多处理、apply_async 和 yield 在此示例中,我使用了 multiprocessing.pool 并使用 apply_async 进行并行化。我在“并行”函数中放置了一些打印语句,但它们没有被打印出来。 当我用 return 替换 yield 时,打印语句会得到反映。我不确定产量的性质。我知道它是一个生成器,返回后只能使用一次。请告知如何使其正常工作。

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

【问题讨论】:

    标签: python multiprocessing yield


    【解决方案1】:

    当调用包含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)
    

    【讨论】:

    • 我不明白这有什么帮助,因为我的问题很相似,而我想要并行化的函数实际上是生成器。我是否正确理解将它变成一个列表只会让它运行每次迭代,这将花费与在 for 循环中使用生成器相同的时间长度?
    猜你喜欢
    • 2020-03-12
    • 2021-07-24
    • 2020-08-14
    • 2016-11-10
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 2016-12-07
    相关资源
    最近更新 更多