排队多个子进程
Queue-ing multiple subprocesses
我需要一些帮助来控制子流程。
我真的不确定我还需要 do/research 哪个方向的代码。
目前,我正在使用 python 控制软件的 运行ning,如下面的代码所示。
import subprocess
# Declaring some input and output names for the third-party program
label = ['fname1', 'fname2', 'fname3', 'fname4']
input_list = [ 'inp.'+ l for l in label ]
output_list = [ 'out.'+ l for l in label ]
# Run all sets of input and output using the third-party software
for in, out in zip(input_list, output_list):
#The bash command to run the executable
command = f"mpirun pw.x < {in} > {out}"
subprocess.run(command, shell=True)
我的电脑有 64 个逻辑内核,正如我用软件测试的那样,使用 32 和 64 不会改变计算速度,因此,我想编辑代码以适应两个并发 subprocess.run 与 mpirun -n 32 ...
.
我不知道如何做并发的事情,比如排队和控制在给定时间允许 运行 子进程的实例数量。
请问哪个 module/library 可以帮我完成这件事?当然,我们将不胜感激。
P.S. PBS/SLURM systems are not an option because I am also doing some processing stuff within the python script.
谢谢!
如果你想 运行 mpirun -n 32
并行两次,试试这个:
import concurrent.futures
labels = ['fname1', 'fname2']
with concurrent.futures.ProcessPoolExecutor(max_workers=len(labels)) as pool:
for label in labels:
command = f"mpirun -n 32 pw.x < inp.{label} > out.{label}"
pool.submit(subprocess.run, command, shell=True)
with
语句将在最后关闭池,使其等待所有作业完成。
我需要一些帮助来控制子流程。 我真的不确定我还需要 do/research 哪个方向的代码。
目前,我正在使用 python 控制软件的 运行ning,如下面的代码所示。
import subprocess
# Declaring some input and output names for the third-party program
label = ['fname1', 'fname2', 'fname3', 'fname4']
input_list = [ 'inp.'+ l for l in label ]
output_list = [ 'out.'+ l for l in label ]
# Run all sets of input and output using the third-party software
for in, out in zip(input_list, output_list):
#The bash command to run the executable
command = f"mpirun pw.x < {in} > {out}"
subprocess.run(command, shell=True)
我的电脑有 64 个逻辑内核,正如我用软件测试的那样,使用 32 和 64 不会改变计算速度,因此,我想编辑代码以适应两个并发 subprocess.run 与 mpirun -n 32 ...
.
我不知道如何做并发的事情,比如排队和控制在给定时间允许 运行 子进程的实例数量。
请问哪个 module/library 可以帮我完成这件事?当然,我们将不胜感激。
P.S. PBS/SLURM systems are not an option because I am also doing some processing stuff within the python script.
谢谢!
如果你想 运行 mpirun -n 32
并行两次,试试这个:
import concurrent.futures
labels = ['fname1', 'fname2']
with concurrent.futures.ProcessPoolExecutor(max_workers=len(labels)) as pool:
for label in labels:
command = f"mpirun -n 32 pw.x < inp.{label} > out.{label}"
pool.submit(subprocess.run, command, shell=True)
with
语句将在最后关闭池,使其等待所有作业完成。