Python:使用多处理来划分图形

时间:2015-08-11 00:01:38

标签: python graph multiprocessing

我正在修改现有代码以添加多处理。有问题的代码使用队列对图形进行分区,以生成多序列比对的列。

队列代码在队列不为空时运行。使用单个图形初始化队列。

graphs=[graph]
while graphs:
    g = graphs.pop()
    if g.is_column():
        #append data from graph to another list
        map_columns.append(g.lengths)
        continue
    l, r = g.split() 
    g.append(l)
    g.append(r)

我想这样做,以便代码有一个进程池,它填充图形,然后将新图形添加到池中,直到没有更多的图形不是列。

之前我使用过Python多处理程序包,但我不确定如何将它用于此问题。我将如何将图形发送到子进程以便最多n个进程处于活动状态(对于n个核心)并确保循环结束一次我真的没有子图留给分区?

1 个答案:

答案 0 :(得分:0)

在每个算法步骤中,您都要生成一组新的图表。您可以将其视为二叉树生成器,因此,您可以拥有一个进程池并为每个树级别运行算法。在开始时(在树的顶部)不会发生并行性,但是当你开始生成树时,如果树有点平衡,你将从这个实现中受益。

from multiprocessing import Pool, Queue


pool = Pool(6)
result_queue = Queue()
graphs=[graph]
intermediary_graphs[graph]

def work(graphs):
    if g.is_column():
        #append data from graph to another list
        map_columns.append(g.lengths)
        return
    l, r = g.split() 
    intermediary_graphs.append(l)
    intermediary_graphs.append(r)
    result_queue.put(l, r)

while graphs:
    pool.map(work, graphs)
    graphs = []
    while not result_queue.empty():
        graphs.append(result_queue.get())

请注意我没有测试过这个。如果没有运行,请使用伪代码并进行优化。

所有中间图都将存储在intermediary_graphs中,graphs变量将在每次迭代时清空,并使用我们生成的图表树中的新级别节点重新填充。

希望这有帮助。