Python多进程不循环for

Python multiple processes do not loop on for

我正在研究实现几种计算图上最短路径的算法。

我已经设法按顺序实现了 Dijkstra 的算法,现在我正在尝试通过 Python 的多处理模块来优化我的算法。

作为一个整体,代码有效。我在这里要做的是:

当我 运行 我的脚本(从 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()

我找到问题的根源了。

tab_dist[node] = 0 放错了地方,应该放在 if do_print: 语句之前。

一切正常。