首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用python子进程()运行多个命令而不等待每个命令的结束?

如何使用python子进程()运行多个命令而不等待每个命令的结束?
EN

Stack Overflow用户
提问于 2022-03-16 22:18:51
回答 1查看 2.4K关注 0票数 0

在这个任务中有两个涉及的python脚本。

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

由于通过SSH对每个实例手动运行first脚本非常麻烦,所以我编写了一个python脚本(第二个脚本),该脚本将SSHs放入每个区域的VM中,并运行前面提到的first脚本

在不同区域运行 first script的第二个脚本的问题是,在第二个区域的VM中运行完之后,才开始在第二个区域的VM中运行first script,而需要第二个脚本在每个区域运行first scriptE 219,而无需等待E 120启动的进程结束。

我在第二个脚本中使用子进程()在每个VM中运行第一个脚本。

下面的代码是第二个脚本

代码语言:javascript
运行
复制
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)

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

下面的代码是第一个脚本

代码语言:javascript
运行
复制
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)

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-16 22:41:18

在每个脚本中使用Popen(command_lst, shell=True)关闭您的Popen(command_lst, shell=True),并循环执行命令列表,如下面的示例所示,以便并行运行进程。

为了简单起见,您可以使用任意命令来实现Popen并行运行进程。

代码语言:javascript
运行
复制
from subprocess import Popen

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

processes = [Popen(cmd, shell=True) for cmd in commands]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71504877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档