多处理后管理打印输出顺序
managing sequence of print output after multiprocessing
我有以下代码部分使用多处理来 运行 def chi2(i) 然后打印出完整的输出:
import cmath, csv, sys, math, re
import numpy as np
import multiprocessing as mp
x1 = np.zeros(npt ,dtype=float)
x2 = np.zeros(npt ,dtype=float)
def chi2(i):
print("wavelength", i+1," of ", npt)
some calculations that generate x1[(i)], x2[(i)] and x[(1,i)]
print("\t", i+1,"x1:",x1[(i)])
print("\t", i+1,"x2:",x2[(i)])
x[(1,i)] = x1[(i)] * x2[(i)]
print("\t", i+1,"x:",x[(1,i)])
return x[(1,i)]
#-----------single process--------------
#for i in range (npt):
# chi2(i)
#------------parallel processes-------------
pool = mp.Pool(cpu)
x[1] = pool.map(chi2,[i for i in range (npt)])
pool.close()
#general output
print("x: \n",x.T)
如果我运行脚本使用单个进程(脚本中的注释部分),输出是我想要的形式:
wavelength 1 of 221
1 x1: -0.3253846181978943
1 x2: -0.012596285460978723
1 x: 0.004098637535432249
wavelength 2 of 221
2 x1: -0.35587046869939154
2 x2: -0.014209153301058522
2 x: 0.005056618045069202
...
x:
[[3.30000000e+02 4.09863754e-03]
[3.40000000e+02 5.05661805e-03]
[3.50000000e+02 6.20083938e-03]
...
但是,如果我 运行 具有并行进程的脚本,wavelength i of npt
的输出将在 print("x: \n",x.T)
的输出之后打印,即使它首先出现在脚本中:
x:
[[3.30000000e+02 4.09863754e-03]
[3.40000000e+02 5.05661805e-03]
[3.50000000e+02 6.20083938e-03]
...
wavelength 1 of 221
1 x1: -0.3253846181978943
1 x2: -0.012596285460978723
1 x: 0.004098637535432249
wavelength 2 of 221
2 x1: -0.35587046869939154
2 x2: -0.014209153301058522
2 x: 0.005056618045069202
...
我怀疑这与 mp.pool 的处理时间有关,与更简单的 print("x: \n",x.T)
相比,pool.close()
之后生成输出所需的时间更长。我可以知道如何更正输出顺序,以便 运行 使用并行进程的脚本将提供与脚本 运行 使用单个进程时相同的输出顺序吗?
多处理的意义在于 运行 两个进程同时进行而不是按顺序进行。由于进程之间是相互独立的,因此它们会独立地打印到控制台,因此打印的顺序可能会随着执行的不同而改变。
当您执行 pool.close() 时,池将关闭,但其进程会继续 运行。另一方面,主进程继续并打印到控制台。
如果只想在池中的进程执行完毕后打印,请在 pool.close() 之后添加 pool.join() ,这将等待池中的进程完成后再继续主进程。
我有以下代码部分使用多处理来 运行 def chi2(i) 然后打印出完整的输出:
import cmath, csv, sys, math, re
import numpy as np
import multiprocessing as mp
x1 = np.zeros(npt ,dtype=float)
x2 = np.zeros(npt ,dtype=float)
def chi2(i):
print("wavelength", i+1," of ", npt)
some calculations that generate x1[(i)], x2[(i)] and x[(1,i)]
print("\t", i+1,"x1:",x1[(i)])
print("\t", i+1,"x2:",x2[(i)])
x[(1,i)] = x1[(i)] * x2[(i)]
print("\t", i+1,"x:",x[(1,i)])
return x[(1,i)]
#-----------single process--------------
#for i in range (npt):
# chi2(i)
#------------parallel processes-------------
pool = mp.Pool(cpu)
x[1] = pool.map(chi2,[i for i in range (npt)])
pool.close()
#general output
print("x: \n",x.T)
如果我运行脚本使用单个进程(脚本中的注释部分),输出是我想要的形式:
wavelength 1 of 221
1 x1: -0.3253846181978943
1 x2: -0.012596285460978723
1 x: 0.004098637535432249
wavelength 2 of 221
2 x1: -0.35587046869939154
2 x2: -0.014209153301058522
2 x: 0.005056618045069202
...
x:
[[3.30000000e+02 4.09863754e-03]
[3.40000000e+02 5.05661805e-03]
[3.50000000e+02 6.20083938e-03]
...
但是,如果我 运行 具有并行进程的脚本,wavelength i of npt
的输出将在 print("x: \n",x.T)
的输出之后打印,即使它首先出现在脚本中:
x:
[[3.30000000e+02 4.09863754e-03]
[3.40000000e+02 5.05661805e-03]
[3.50000000e+02 6.20083938e-03]
...
wavelength 1 of 221
1 x1: -0.3253846181978943
1 x2: -0.012596285460978723
1 x: 0.004098637535432249
wavelength 2 of 221
2 x1: -0.35587046869939154
2 x2: -0.014209153301058522
2 x: 0.005056618045069202
...
我怀疑这与 mp.pool 的处理时间有关,与更简单的 print("x: \n",x.T)
相比,pool.close()
之后生成输出所需的时间更长。我可以知道如何更正输出顺序,以便 运行 使用并行进程的脚本将提供与脚本 运行 使用单个进程时相同的输出顺序吗?
多处理的意义在于 运行 两个进程同时进行而不是按顺序进行。由于进程之间是相互独立的,因此它们会独立地打印到控制台,因此打印的顺序可能会随着执行的不同而改变。
当您执行 pool.close() 时,池将关闭,但其进程会继续 运行。另一方面,主进程继续并打印到控制台。
如果只想在池中的进程执行完毕后打印,请在 pool.close() 之后添加 pool.join() ,这将等待池中的进程完成后再继续主进程。