我正在尝试将 bash 脚本迁移到 Python。
bash 脚本并行运行多个操作系统命令,然后等待它们完成后再恢复,即:
命令1 &
命令2 &
.
命令&
等等
命令
我想使用Python子进程来实现同样的目的。这可能吗?我如何等待子进程?在恢复之前调用命令完成。
您仍然可以使用
Popen
,它采用与 subprocess.call
相同的输入参数,但更灵活。
:完整的函数签名与 Popen 构造函数的相同 - 该函数将所有提供的参数直接传递到该接口。subprocess.call
一个区别是
subprocess.call
会阻塞并等待子进程完成(它构建在 Popen
之上),而 Popen
不会阻塞,因此允许您并行启动其他进程。
尝试以下操作:
from subprocess import Popen
commands = ['command1', 'command2']
procs = [ Popen(i) for i in commands ]
for p in procs:
p.wait()
扩展 Aaron 和 Martin 的答案,这是一个使用
subprocess
和 Popen
并行运行 n 进程的解决方案:
import subprocess
commands = ['cmd1', 'cmd2', 'cmd3', 'cmd4', 'cmd5']
n = 2 #the number of parallel processes you want
for j in range(max(int(len(commands)/n), 1)):
procs = [subprocess.Popen(i, shell=True) for i in commands[j*n: min((j+1)*n, len(commands))] ]
for p in procs:
p.wait()
我发现当使用多处理等工具可能会导致不良行为时,这非常有用。