Python多进程不循环

2024-06-02 11:43:31 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我已经成功地按顺序实现了Dijkstra的算法,现在我正试图通过Python的多处理模块来优化我的算法。你知道吗

作为一个整体,代码是有效的。我想做的是:

  • 首先检查我可以使用nb_cpu = mp.cpu_count()处理多少个cpu
  • 然后将图中的所有节点进行相应的划分
  • 最后调用应该为每个节点计算dijkstra算法的方法subprocess_dijkstra,它作为一个参数给出(其思想是每个进程只需要为图的较小部分计算算法)。你知道吗

当我运行脚本时(从主.py文件中,我只是格式化的数据,以满足我的需要),我有4个进程启动,因为我应该。你知道吗

但是,它们似乎没有执行for node in nodes中定义的subprocess_dijkstra循环。你知道吗

每个进程只计算一次代码,然后它们无限期地等待。。。你知道吗

这是我第一次尝试在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()

Tags: innodeforifdistcpudotab