假设我有几个生成器(应该能够并行运行)。是否可以使用多处理模块在这些生成器上调用next(),以便处理并行运行?
我想避免从生成器中创建一个列表,因为它很可能消耗大量内存。
上下文:最初我有一个生成器,它输出给定图形的所有生成树。该算法的一部分涉及迭代给定顶点的邻居的子集的幂集。我想将这部分并行化,至少对于初始调用。对于某个图形,输出前1024棵树的树需要大约半秒钟。
答案 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