Python多进程不循环for
Python multiple processes do not loop on for
我正在研究实现几种计算图上最短路径的算法。
我已经设法按顺序实现了 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()
我找到问题的根源了。
tab_dist[node] = 0
放错了地方,应该放在 if do_print:
语句之前。
一切正常。
我正在研究实现几种计算图上最短路径的算法。
我已经设法按顺序实现了 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()
我找到问题的根源了。
tab_dist[node] = 0
放错了地方,应该放在 if do_print:
语句之前。
一切正常。