首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多处理后打印输出的管理顺序

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

Stack Overflow用户
提问于 2020-08-05 04:15:10
回答 1查看 257关注 0票数 0

我有下面的代码部分,它使用多处理来运行def chi2(i),然后输出完整的输出:

代码语言:javascript
运行
复制
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)

如果我使用单个进程(脚本中的注释部分)运行脚本,则输出以我希望的形式出现:

代码语言:javascript
运行
复制
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)的输出之后,尽管它首先出现在脚本中:

代码语言:javascript
运行
复制
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)。我可以知道如何纠正输出序列,以便使用并行进程运行脚本将提供与单个进程运行脚本相同的输出序列吗?

EN

Stack Overflow用户

回答已采纳

发布于 2020-08-05 04:21:42

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

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

如果只想在池的进程执行完之后打印,那么在pool.join()之后添加pool.close(),这将等待池在继续主进程之前完成该进程。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63258348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档