多处理后管理打印输出顺序

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() ,这将等待池中的进程完成后再继续主进程。