我有下面的代码部分,它使用多处理来运行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的处理时间有关,pool.close()之后需要更长的时间才能生成输出,而不是简单的print("x: \n",x.T)。我可以知道如何纠正输出序列,以便使用并行进程运行脚本将提供与单个进程运行脚本相同的输出序列吗?
发布于 2020-08-05 04:21:42
多进程同时运行两个进程而不是顺序运行的多进程点。由于进程是相互独立的,因此它们独立地打印到控制台,因此打印的顺序可能会从执行到执行。
执行pool.close()时,池将关闭,但其进程将继续运行。另一方面,主进程继续并打印到控制台。
如果只想在池的进程执行完之后打印,那么在pool.join()之后添加pool.close(),这将等待池在继续主进程之前完成该进程。
https://stackoverflow.com/questions/63258348
复制相似问题