2015-04-04 19 views
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() 

回答

0

我已經找到了我的問題的根源。

tab_dist[node] = 0放錯了位置,應放在if do_print:聲明之前。

所有現在正在工作。