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

Posted

技术标签:

【中文标题】多处理后管理打印输出顺序【英文标题】:managing sequence of print output after multiprocessing 【发布时间】:2020-11-25 05:26:23 【问题描述】:

我有以下代码部分,它使用多处理来运行 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) 需要更长的时间。我可以知道如何更正输出序列,以便使用并行进程运行脚本将提供与使用单个进程运行脚本时相同的输出序列吗?

【问题讨论】:

【参考方案1】:

多处理的意义在于同时运行两个进程而不是顺序运行。由于进程相互独立,因此它们独立打印到控制台,因此打印顺序可能会从执行到执行。

当您执行 pool.close() 时,池关闭但其进程继续运行。另一方面,主进程继续并打印到控制台。

如果您只想在池的进程执行完成后打印,请在 pool.close() 之后添加 pool.join() ,它将等待池完成该进程,然后再继续执行主进程。

【讨论】:

以上是关于多处理后管理打印输出顺序的主要内容,如果未能解决你的问题,请参考以下文章

JUC并发编程 多线程设计模式 -- 同步模式之顺序控制( 固定运行顺序 & 交替输出)

组策略6.组策略处理顺序说明

多线程面试题之三线程按顺序交替打印ABC的方法

java多线程笔记--顺序执行

保留多线程API中的传入请求顺序并按顺序处理

1043. 输出PATest(20)