如何使用 python subprocess() 运行多个命令而不等待每个命令结束?

DO *_*Kim 0 python terminal subprocess google-compute-engine google-cloud-platform

此任务涉及两个 python 脚本。

我当前的任务要求我在 GCP 实例上的 29 个可用区域中的每一个中运行一个很长的过程(每个过程大约需要一两天,这是第一个 python 脚本)。为了尽快完成任务,我尝试在一次性分拆 29 个虚拟机后同时运行每个实例中的每个进程。

由于通过 SSH 手动运行第一个脚本到每个实例非常麻烦,因此我编写了一个python 脚本(第二个脚本),通过 SSH 连接到每个区域的虚拟机并运行我上面提到的第一个脚本

在不同区域运行第一个脚本的第二个脚本的问题在于,它不会开始在第二个区域的虚拟机中运行第一个脚本,直到它在第一个区域的虚拟机中完成运行,而我需要第二个脚本来运行第一个脚本在每个区域中编写脚本,而无需等待第一个脚本启动的进程结束。

我在第二个脚本中使用 subprocess()在每个虚拟机中运行第一个脚本

以下代码是第二个脚本

for zone, instance in zipped_zone_instance:
    command = "gcloud compute ssh --zone " + zone + " " +  instance + " --project cloud-000000 --command"
    command_lst = command.split(" ")
    command_lst.append("python3 /home/first_script.py")
    subprocess.run(command_lst)
Run Code Online (Sandbox Code Playgroud)

我需要 subprocess.run(command_lst) 一次为每 29 个区域运行,而不是仅在第一个区域的进程结束后才为第二个区域运行。

以下代码是第一个脚本

for idx, bucket in enumerate(bucket_lst):

    start = time.time()
    sync_src = '/home/' + 'benchmark-' + var_
    subprocess.run(['gsutil', '-m', '-o', 'GSUtil:parallel_composite_upload_threshold=40M', 'rsync', '-r', sync_src, bucket])
    end = time.time() - start
    time_lst.append(end)
    tput_lst.append(tf_record_disk_usage / end)
Run Code Online (Sandbox Code Playgroud)

我可以在第二个脚本第一个脚本中修复什么来实现我想要的?

Dig*_*eld 5

在每个脚本中切换你的subprocess.run(command_lst)withPopen(command_lst, shell=True)并循环遍历命令列表,如下例所示,以并行运行进程。

为了简单起见,这就是您如何实现 Popen 以使用任意命令并行运行进程。

from subprocess import Popen

commands = ['ls -l', 'date', 'which python']

processes = [Popen(cmd, shell=True) for cmd in commands]
Run Code Online (Sandbox Code Playgroud)