如何在 Python 中并行运行多个子进程并等待它们完成

问题描述 投票:0回答:2

我正在尝试将 bash 脚本迁移到 Python。

bash 脚本并行运行多个操作系统命令,然后等待它们完成后再恢复,即:

命令1 &

命令2 &

.

命令&

等等

命令

我想使用Python子进程来实现同样的目的。这可能吗?我如何等待子进程?在恢复之前调用命令完成。

python multiprocessing
2个回答
35
投票

您仍然可以使用

Popen
,它采用与
subprocess.call
相同的输入参数,但更灵活。

subprocess.call
:完整的函数签名与 Popen 构造函数的相同 - 该函数将所有提供的参数直接传递到该接口。

一个区别是

subprocess.call
会阻塞并等待子进程完成(它构建在
Popen
之上),而
Popen
不会阻塞,因此允许您并行启动其他进程。

尝试以下操作:

from subprocess import Popen
commands = ['command1', 'command2']
procs = [ Popen(i) for i in commands ]
for p in procs:
   p.wait()

5
投票

扩展 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()

我发现当使用多处理等工具可能会导致不良行为时,这非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.