并行处理多个发电机

时间:2016-10-11 16:47:09

标签: python

假设我有几个生成器(应该能够并行运行)。是否可以使用多处理模块在这些生成器上调用next(),以便处理并行运行?

我想避免从生成器中创建一个列表,因为它很可能消耗大量内存。

上下文:最初我有一个生成器,它输出给定图形的所有生成树。该算法的一部分涉及迭代给定顶点的邻居的子集的幂集。我想将这部分并行化,至少对于初始调用。对于某个图形,输出前1024棵树的树需要大约半秒钟。

1 个答案:

答案 0 :(得分:1)

我认为您的主要问题是将数据库提供给父流程以构建图表。但是,这可能通过使用多处理Queue来完成。

一个简单的例子:

import multiprocessing
from queue import Empty

def call_generator(generator, queue):
    for item in generator:
        queue.put(item)

def process_responses(queue):
    items = []
    while True:
        try:
            # After a one second timeout, we'll assume the generators are done
            item = queue.get(timeout=1)
        except Empty:
            print('done')
            break

        print('item: {}'.format(item))

generators = [
    iter(range(10)),
    iter(range(11, 20)),
    iter(range(20, 50))
]

queue = multiprocessing.Queue()

p = multiprocessing.Process(target=process_responses, args=(queue,))
p.start()


for generator in generators:
    generator_process = multiprocessing.Process(
        target=call_generator,
        args=(generator, queue)
    )
    generator_process.start()

p.join() # Wait for process_response to return