我正在修改现有代码以添加多处理。有问题的代码使用队列对图形进行分区,以生成多序列比对的列。
队列代码在队列不为空时运行。使用单个图形初始化队列。
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个核心)并确保循环结束一次我真的没有子图留给分区?
答案 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
变量将在每次迭代时清空,并使用我们生成的图表树中的新级别节点重新填充。
希望这有帮助。