问题描述:我在正在通过Python执行shell命令来调用本专业软件进行大量分析,每条命令执行完(即软件分析完成)后会自动生成一些文件,接着要读取这些文件,因为需要反复调用本专业软件的次数太多,而且本专业软件单独分析一次需要十几秒,所以此想要了并行的概念。
目的:我需要同时执行上百条shell命令,并在命令完全执行完毕后,接着读取本专业软件生成的结果文件,我先后使用了两种办法去解决问题,具体如下
方案一:仅使用subprocess库,代码如下,
import subprocess as sbp
processes = []
for ii in range(10):
newfolder = 'test' + str(ii + 1)
cc = sbp.Popen(cmd, cwd=newfolder, shell=True)
processes.append(cc)
for jj in range(10):
processes[jj].wait()
这段代码运行完毕会生成几个文件,后续代码的功能是读取这些文件,如果只是两三条命令同时执行,不会出问题,但当我试图同时执行10条命令时,运行后极少数情况会正常,大多时候会报错,报错的提示就是没有发现某某文件,打开失败,由此判断应该是某些文件夹下的cmd命令并没有执行完毕。请问朋友们该怎么处理?
方案二:使用subprocess库和multiprocessing库,代码如下,
import subprocess as sbp
import multiprocessing as mlp
def run_shell(number):
sbp.Popen(cmd, cwd='test' + str(number), shell=True)
numlist = [ii + 1 for ii in range(100)]
pool = mlp.Pool(100)
pool.map(run_shell, numlist)
pool.close()
pool.join()
类似的,执行过程也会因为没有生成某些文件打开失败而中断,经过学习,我了解到受计算机CPU数的限制,例如CPU数为4,则程序会创建4个进程,待其中之一执行完毕后才会执行第5条命令,请问大家如何保证这100个进程全部运行结束再执行后续代码?
此外,将这两种方案导入time模块进行计时,发现方案一输出的时间包含了本专业软件运行消耗的时间,而方案二输出的时间似乎只是创建进程消耗的时间,如何使方案二把调用本专业软件进行分析的用时也涵盖上呢?