Python3:使用Yield生成器的并行处理

时间:2018-03-06 20:14:35

标签: python-3.x concurrency python-multiprocessing

我将有一个产生值的函数和另一个将对这些产生的值执行某些操作的函数。我想使用并行处理(即concurrent.futures.ProcessPoolExecutor或Multiprocessing)进行操作。该过程的顺序很重要,即第一输出应该是第一输入。伪代码如下:

def square(x):
    return x**2

def numbers():
    for i in range(1,10):
        yield i

if __name__ == '__main__':
    with concurrent.futures.ProcessPoolExecutor(4) as executor:        
       for i in executor.map(square, numbers):
           print(i)

我有以下问题,我没有找到太多解释:

1)如何绘制yield yield和函数

2)如果ProcessPoolExecutor是正确的选择,因为它异步并且会混乱   按输出顺序排列。

3)如何使用多处理池和生成器。池地图方法不是   为我打印任何输出。我很难理解这个   多处理池的应用。

if __name__ == '__main__':
    with mp.Pool(4) as p:        
        print(p.map(square, numbers))

如果有人能帮我理解并行处理,我将不胜感激。

P.S。我知道如果我将生成器函数转换为数字列表并映射函数square,它很容易使用并理解多处理;而且一切正常但我不想在内存中加载整个数据。

1 个答案:

答案 0 :(得分:1)

您的示例中都有错误。您必须调用 numbers函数来实际生成生成器:

if __name__ == '__main__':
    with concurrent.futures.ProcessPoolExecutor(4) as executor:        
       for i in executor.map(square, numbers()):
           print(i)

if __name__ == '__main__':
    with mp.Pool(4) as p:        
        print(p.map(square, numbers()))