2015-04-04 16 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:声明之前。

所有现在正在工作。