Как запустить несколько команд с помощью подпроцесса python(), не дожидаясь окончания каждой команды?

В этой задаче задействовано два скрипта 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 — процесс блокировки. Вы пробовали использовать subprocess.Popen? stackoverflow.com/questions/21936597/…, docs.python.org/3/library/subprocess.html#subprocess.Popen
rayryeng 16.03.2022 23:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поменяйте местами 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]

Другие вопросы по теме