TenSuns 发表于 2022-11-10 15:05:14

Python通过shell命令同时多次调用其他软件,出现报错

万能的uu们,我又来了
问题描述:我正在用python语言通过shell命令调用其他软件进行大量计算,单个模型本身计算求解只需要十几秒,但因为模型数量较多,一个一个执行的话,时间成本就会很大。
因此我想到多个模型同时执行分析,于是前两天咨询了uu们,得知通过subprocess库,形如这样
c1 = subprocess.Popen('cmd1', shell=True)
c2 = subprocess.Popen('cmd2', shell=True)
c1.wait()
c2.wait()
就可以实现几乎同时调用两次软件,沿着这个思路,我把同时运行的模型数量设置为5,发现没有问题,但设置为10的时候报错,调用开始的时候没问题,当10个模型提交到被调用软件后,分析过程中,发现有的模型可以正常求解完毕,有的模型分析过程中中断,请问是不是因为我的CPU数量不足以支持大量模型同时计算?还是说我通过shell 命令同时调用软件分析多个模型的代码用的subprocess库不对?

dolly_yos2 发表于 2022-11-10 15:05:15

具体实现可能有各种方式,但整体上的思路是这样的:
把要运行的命令分为若干批次,从 1 到 N 有序编号,使得这些批次满足这样的约束:对于第 k 批次中的任何一个命令,其可以使用第 1 到 k-1 批次中命令的任何结果,但不能使用任何第 k 到 N 批次中命令的结果,且任何两个属于第 k 批次的命令不能同时修改同一个对象,如向同一个文件写入(除非对此情况进行了正确的处理)
进行这样的划分之后,从第 1 批次开始并行的启动其中全部的命令,启动后等待全部执行结束,开始启动下一个批次,按照此流程进行直到全部批次启动并运行完毕

wp231957 发表于 2022-11-10 15:18:43

多进程不行吗

人造人 发表于 2022-11-10 15:23:01

这你得看 模型分析过程中断 的原因是什么
说不定还是内存不够用了呢?对吧?
这你得看中断的原因,为什么中断了

TenSuns 发表于 2022-11-10 15:32:53

wp231957 发表于 2022-11-10 15:18
多进程不行吗

又来麻烦您了,我需要通过shell命令启动我们专业的软件,仔细看了一下multiprocessing库,似乎没有shell命令这个选项,由于本身是工程专业出身,因此对代码的理解还是差很多

TenSuns 发表于 2022-11-10 15:39:50

人造人 发表于 2022-11-10 15:23
这你得看 模型分析过程中断 的原因是什么
说不定还是内存不够用了呢?对吧?
这你得看中断的原因,为什么 ...

谢谢您的提示,刚重新运行了一次代码,发现中断的原因是没有发现某些文件,读取错误导致中断。我的代码是通过shell命令调用其他软件进行分析,待所有模型全部分析完成之后,会自动生成一些文件,接着访问这些文件,输出一些数据。刚发现,出错在于还没有生成需要的文件,读取错误,导致程序中断。原来我是把求解计算和读取这两步放在一个模型脚本中的,我先尝试分开看看如何

人造人 发表于 2022-11-10 15:49:55

TenSuns 发表于 2022-11-10 15:39
谢谢您的提示,刚重新运行了一次代码,发现中断的原因是没有发现某些文件,读取错误导致中断。我的代码是 ...

既然知道了出错的原因,那也就知道如何解决这个问题了吧

TenSuns 发表于 2022-11-10 15:53:46

人造人 发表于 2022-11-10 15:49
既然知道了出错的原因,那也就知道如何解决这个问题了吧

非常感谢您的提示,我正在试着解决

TenSuns 发表于 2022-11-11 00:52:24

下午学习了一下multiprocessing库,使用Pool进程池创建100了个进程,通过shell命令并行执行test1到test100文件夹下的py文件,
我已知道受计算机CPU数的限制,例如CPU数为4,则程序会创建4个进程,待其中之一执行完毕后才会执行第5个py文件,
目前遇到的问题是,后续还有代码,现在需要这100个进程全部运行结束再执行后续代码,请问大家应该怎么处理?
下面是部分代码,希望大佬帮忙!

import subprocess as sbp
import multiprocessing as mlp

def run_shell(number):
    sbp.Popen(cmd, cwd='test' + str(number), shell=True)

numlist =
pool = mlp.Pool(100)
pool.map(run_shell, numlist)
pool.close()
pool.join()

TenSuns 发表于 2022-11-11 00:53:45

请求大佬受累讲解一下,再次感谢@wp231957

TenSuns 发表于 2022-11-11 01:15:19

同时,把之前仅用subprocess库的代码贴出来,这段代码运行完毕会生成几个文件,后续代码的功能是读取这些文件
如果只是两三条命令同时执行,不会出问题,但当我试图同时执行10条命令时,代码如下,
运行后,极少数情况正常,大多时候会报错,报错的内容就是没有发现某某文件,打开失败,
由此判断应该是某些文件夹下的cmd命令并没有执行完毕
请问大佬该怎么处理?

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.wait()

阿奇_o 发表于 2022-11-11 12:58:35

TenSuns 发表于 2022-11-11 01:15
同时,把之前仅用subprocess库的代码贴出来,这段代码运行完毕会生成几个文件,后续代码的功能是读取这些文 ...

创建几个文件和读取,就不应该用多进程来做了吧。。
多进程是不能保证顺序的,肯定要先保证创建完后,才能读取到呀。

页: [1]
查看完整版本: Python通过shell命令同时多次调用其他软件,出现报错