0
我正在执行几种算法来计算图上的最短路径。Python多个进程不循环
我已经成功地实现了Dijkstra的算法,我现在试图通过Python的多处理模块来优化我的算法。
整体代码起作用。我想在这里做的是:
- 首先要检查我多少CPU可以
nb_cpu = mp.cpu_count()
- 然后相应地将我所有的节点在我的图表
- 最后调用方法
subprocess_dijkstra
工作对应该为每个节点计算dijkstra算法作为参数(这个想法是每个进程只需要为图的一个较小部分计算算法)。
当我运行我的脚本(从main.py文件调用,我只是格式化数据以满足我的需要)时,我有4个进程启动,因为我应该。
但是,他们似乎并未执行subprocess_dijkstra
中定义的for node in nodes
循环。
每个过程只计算一次代码,然后他们继续保持下去......
这是我在Python的多处理器下的第一次尝试,所以我可能会错过一个细节。有人有想法吗?
当我中断脚本时,python告诉我中断发生在p.join()
行。
由于任何人帮助我:)
这里是我的代码:
import multiprocessing as mp
def subprocess_dijkstra(do_print, nodes, tab_contenu, tab_distances):
tab_dist_initial = dict(tab_distances)
tab_dist = dict()
for node in nodes:
visited_nodes = list()
tab_dist = dict(tab_dist_initial)
dmin = -1
resultat = ""
filename = "dijkstra"+str(node)+".txt"
if do_print:
dt = open(filename, 'w')
tab_dist[node] = 0
"""Ligne de résultat initiale"""
for valeur in tab_dist.values():
resultat += str(valeur)
resultat += " "
resultat += "\n"
dt.write(resultat)
while len(visited_nodes) != len(tab_contenu):
""" On se place sur le noeud non visité qui a la distance minimale de notre départ """
for cle, valeur in tab_dist.items():
if cle not in visited_nodes:
if dmin ==-1 or valeur<dmin:
dmin = valeur
node = cle
""" On vérifie que le noeud n'a pas déjà été visité """
if (node not in visited_nodes):
""" On regarde les fils de ce noeud et la longueur des arcs"""
for cle,valeur in tab_contenu[node].items():
tab_dist[cle] = min(tab_dist[cle], tab_dist[node]+valeur)
visited_nodes.append(node)
if do_print:
resultat = ""
""" Ligne de résultat """
for valeur in tab_dist.values():
resultat += str(valeur)
resultat += " "
resultat += "\n"
dt.write(resultat)
if do_print:
dt.close()
def main(do_print,donnees):
tab_contenu = donnees[1]
nb_nodes = int(donnees[0])
tab_distances = {x: float('inf') for x in range(nb_nodes)}
args=[(do_print, x, tab_contenu, tab_distances) for x in range(nb_nodes)]
nb_cpu = mp.cpu_count()
pool = mp.Pool(processes = nb_cpu)
pool.starmap(subprocess_dijkstra, args)
pool.close()
pool.join()