文章目录
话不多说了,直接看代码。
subprocess基础使用
假设我要运行一个名字叫helloworld.py
的文件,在主程序如下运行即可。
主程序
import subprocess
p = subprocess.Popen(["python", "helloworld.py"])
相当于就是在执行,
python helloworld.py
所以,如果helloworld.py需要额外传入参数才能运行,可以在那个列表["python", "helloworld.py"]
里继续添加。例如:
python helloworld.py --args 1
subprocess高级使用
上面这样执行另外一个python程序,其实我们并没有关心那个程序什么时候运行结束。
有的时候我们有这种需求:主程序需要等待helloworld.py
运行结束才能往下运行,因为helloworld.py
运行结束后会输出一些结果,这些结果是主程序需要的。
那该怎么做呢?使用wait
import subprocess
p = subprocess.Popen(["python", "helloworld.py"])
p.wait()
后面的程序
这样的话,后面的程序就会等待helloworld.py
运行结束后再运行,没有wait
的话后面的程序与helloworld.py
并行运行。
subprocess多进程
上面只调用了一个外部文件执行,我们可以多调用几个,这几个程序是并行执行的!
Ps=[]
p1 = subprocess.Popen(["python", "helloworld.py"])
Ps.append(p1)
p2 = subprocess.Popen(["python", "helloworld2.py"])
Ps.append(p2)
for p in Ps:
p.wait()
后面的程序
p1和p2这两个进程谁先执行完毕是未知的。使用wait之后,我们会等待这两个进程都执行完毕之后再执行主程序。
subprocess执行情况
执行子进程的过程中,有可能子进程报错了,那我们在主进程中怎么知道呢?查看进程的返回码即可。
p.returncode
返回码有以下几种情况:
0:执行完毕且没有报错。
非0:执行中报了错,停止了运行
None:还没有执行完毕。
在深度学习中的应用
上面开多个进程同时执行多个程序,这在深度学习里面可以对应到开多个进程对多个不同的模型同时训练。
有人说,这样的话,岂不是在多个进程里面,都要重复读取数据,然后模型训练?是的。
只在主进程里读取数据,然后传递数据作为一个参数给新开的各个进程,这个暂时不知道该怎么办。应该可以在主进程里面将数据写入文件,然后各个进程读取。除此之外,想不到更好的办法了,torch.multiprocessing试过了不行,可以看我之前文章。