Python:使用多处理对图进行分区
Python: Using multiprocessing to partition a graph
我正在修改现有代码以添加多处理。有问题的代码使用队列对图形进行分区,以生成用于多序列比对的列。
串行代码在队列不为空时运行。队列使用单个图进行初始化。
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 个内核)并确保一旦我真的没有子图要分区就结束循环?
在每个算法步骤中,您都会生成一组新的图表来处理。您可以将其视为二叉树生成器,因此,您可以拥有一个进程池和 运行 每个树级别的算法。在开始时(在树的顶部)不会发生并行性,但是随着树生成的进行,如果树在某种程度上是平衡的,您将从这个实现中获益。
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
变量将在每次迭代时清空,并用我们正在生成的图树中的新节点级别重新填充。
希望对您有所帮助。
我正在修改现有代码以添加多处理。有问题的代码使用队列对图形进行分区,以生成用于多序列比对的列。
串行代码在队列不为空时运行。队列使用单个图进行初始化。
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 个内核)并确保一旦我真的没有子图要分区就结束循环?
在每个算法步骤中,您都会生成一组新的图表来处理。您可以将其视为二叉树生成器,因此,您可以拥有一个进程池和 运行 每个树级别的算法。在开始时(在树的顶部)不会发生并行性,但是随着树生成的进行,如果树在某种程度上是平衡的,您将从这个实现中获益。
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
变量将在每次迭代时清空,并用我们正在生成的图树中的新节点级别重新填充。
希望对您有所帮助。