如何使用 python subprocess( ) 运行 多个命令而不等待每个命令结束?
How do I run multiple commands with python subprocess( ) without waiting for the end of each command?
此任务涉及两个python个脚本。
我当前的任务需要我 运行 一个漫长的过程(每次大约需要一两天,这是 第一个 python 脚本 ) 在 GCP 实例的 29 个可用区域中的每一个中。为了尽可能快地完成任务,我正在尝试 运行 在一次剥离 29 个虚拟机后,同时 运行 每个实例中的每个进程。
由于通过 SSH 连接到每个实例手动 运行 宁 第一个脚本 很麻烦,我写了一个 python 脚本(第二个脚本)通过 SSH 进入每个区域的虚拟机,运行 是我上面提到的 第一个脚本。
第二个脚本与运行第一个脚本在不同地区的问题是它无法启动在第二个区域的虚拟机中 运行 第一个脚本 直到它在第一个区域的虚拟机中完成 运行ning,而我需要 第二个脚本到运行每个区域的第一个脚本,无需等待由第一个脚本启动的进程结束。
我在 第二个脚本 中使用 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)
我需要同时为每 29 个区域 subprocess.run(command_lst) 到 运行 而不是仅在第一个区域之后才为第二个区域 运行ning进程结束。
下面的代码是第一个脚本:
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)
我可以在第二个脚本或第一个脚本中修复什么来实现我想要的?
在每个脚本中将 subprocess.run(command_lst)
切换为 Popen(command_lst, shell=True)
,然后像下面的示例一样循环遍历命令列表以 运行 并行处理。
为了简单起见,这就是您如何使用任意命令并行实现 运行 进程的 Popen。
from subprocess import Popen
commands = ['ls -l', 'date', 'which python']
processes = [Popen(cmd, shell=True) for cmd in commands]
此任务涉及两个python个脚本。
我当前的任务需要我 运行 一个漫长的过程(每次大约需要一两天,这是 第一个 python 脚本 ) 在 GCP 实例的 29 个可用区域中的每一个中。为了尽可能快地完成任务,我正在尝试 运行 在一次剥离 29 个虚拟机后,同时 运行 每个实例中的每个进程。
由于通过 SSH 连接到每个实例手动 运行 宁 第一个脚本 很麻烦,我写了一个 python 脚本(第二个脚本)通过 SSH 进入每个区域的虚拟机,运行 是我上面提到的 第一个脚本。
第二个脚本与运行第一个脚本在不同地区的问题是它无法启动在第二个区域的虚拟机中 运行 第一个脚本 直到它在第一个区域的虚拟机中完成 运行ning,而我需要 第二个脚本到运行每个区域的第一个脚本,无需等待由第一个脚本启动的进程结束。
我在 第二个脚本 中使用 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)
我需要同时为每 29 个区域 subprocess.run(command_lst) 到 运行 而不是仅在第一个区域之后才为第二个区域 运行ning进程结束。
下面的代码是第一个脚本:
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)
我可以在第二个脚本或第一个脚本中修复什么来实现我想要的?
在每个脚本中将 subprocess.run(command_lst)
切换为 Popen(command_lst, shell=True)
,然后像下面的示例一样循环遍历命令列表以 运行 并行处理。
为了简单起见,这就是您如何使用任意命令并行实现 运行 进程的 Popen。
from subprocess import Popen
commands = ['ls -l', 'date', 'which python']
processes = [Popen(cmd, shell=True) for cmd in commands]