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()