В этой задаче задействовано два скрипта python.
Моя текущая задача требует, чтобы я запускал длительный процесс (занимает около дня или двух на каждый, и это первый скрипт на питоне) в каждом из 29 доступных регионов на экземплярах GCP. Чтобы выполнить задачу как можно быстрее, я пытаюсь запустить каждый процесс в каждом экземпляре одновременно после одновременного отключения 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)
Мне нужно, чтобы 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)
Что я могу исправить в второй сценарий или первый сценарий, чтобы добиться того, чего я хочу??
Поменяйте местами 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]
subprocess.run
— процесс блокировки. Вы пробовали использоватьsubprocess.Popen
? stackoverflow.com/questions/21936597/…, docs.python.org/3/library/subprocess.html#subprocess.Popen