鱼C论坛

 找回密码
 立即注册
查看: 2817|回复: 11

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

[复制链接]
发表于 2022-11-10 15:05:14 | 显示全部楼层 |阅读模式
5鱼币
万能的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库不对?
最佳答案
2022-11-10 15:05:15
具体实现可能有各种方式,但整体上的思路是这样的:
把要运行的命令分为若干批次,从 1 到 N 有序编号,使得这些批次满足这样的约束:对于第 k 批次中的任何一个命令,其可以使用第 1 到 k-1 批次中命令的任何结果,但不能使用任何第 k 到 N 批次中命令的结果,且任何两个属于第 k 批次的命令不能同时修改同一个对象,如向同一个文件写入(除非对此情况进行了正确的处理)
进行这样的划分之后,从第 1 批次开始并行的启动其中全部的命令,启动后等待全部执行结束,开始启动下一个批次,按照此流程进行直到全部批次启动并运行完毕

最佳答案

查看完整内容

具体实现可能有各种方式,但整体上的思路是这样的: 把要运行的命令分为若干批次,从 1 到 N 有序编号,使得这些批次满足这样的约束:对于第 k 批次中的任何一个命令,其可以使用第 1 到 k-1 批次中命令的任何结果,但不能使用任何第 k 到 N 批次中命令的结果,且任何两个属于第 k 批次的命令不能同时修改同一个对象,如向同一个文件写入(除非对此情况进行了正确的处理) 进行这样的划分之后,从第 1 批次开始并行的启动其中全 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-10 15:05:15 | 显示全部楼层    本楼为最佳答案   
具体实现可能有各种方式,但整体上的思路是这样的:
把要运行的命令分为若干批次,从 1 到 N 有序编号,使得这些批次满足这样的约束:对于第 k 批次中的任何一个命令,其可以使用第 1 到 k-1 批次中命令的任何结果,但不能使用任何第 k 到 N 批次中命令的结果,且任何两个属于第 k 批次的命令不能同时修改同一个对象,如向同一个文件写入(除非对此情况进行了正确的处理)
进行这样的划分之后,从第 1 批次开始并行的启动其中全部的命令,启动后等待全部执行结束,开始启动下一个批次,按照此流程进行直到全部批次启动并运行完毕
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-10 15:18:43 From FishC Mobile | 显示全部楼层
多进程不行吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-10 15:23:01 | 显示全部楼层
这你得看 模型分析过程中断 的原因是什么
说不定还是内存不够用了呢?对吧?
这你得看中断的原因,为什么中断了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-10 15:32:53 | 显示全部楼层

又来麻烦您了,我需要通过shell命令启动我们专业的软件,仔细看了一下multiprocessing库,似乎没有shell命令这个选项,由于本身是工程专业出身,因此对代码的理解还是差很多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

使用道具 举报

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

既然知道了出错的原因,那也就知道如何解决这个问题了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-10 15:53:46 | 显示全部楼层
人造人 发表于 2022-11-10 15:49
既然知道了出错的原因,那也就知道如何解决这个问题了吧

非常感谢您的提示,我正在试着解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

  1. import subprocess as sbp
  2. import multiprocessing as mlp

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

  5. numlist = [ii + 1 for ii in range(100)]
  6. pool = mlp.Pool(100)
  7. pool.map(run_shell, numlist)
  8. pool.close()
  9. pool.join()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-11 00:53:45 | 显示全部楼层
请求大佬受累讲解一下,再次感谢@wp231957
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

  1. import subprocess as sbp

  2. processes = []
  3. for ii in range(10):
  4.     newfolder = 'test' + str(ii + 1)
  5.     cc = sbp.Popen(cmd, cwd=newfolder, shell=True)
  6.     processes.append(cc)

  7. for jj in range(10):
  8.     processes[jj].wait()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 07:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表