Как запустить 2 команды одновременно в рамках одного скрипта?

У меня выполняется скрипт, который запускает поочередно команды в консоли, но в моменте мне нужно что бы он запустил две команды одновременно(параллельно) и после выполнения обоих продолжил выполнять команды из скрипта дальше, как это сделать?

import subprocess

list_files = subprocess.run(["command1"]) # начало выполнения скрипта

list_files = subprocess.run(["command2"]) # 2 и 3 выполнить одновременно (параллельно)
list_files = subprocess.run(["command3"])

list_files = subprocess.run(["command4"]) # начинает выполнять эту команду после выполнения команд 2 и 3
  • Вопрос задан
  • 2034 просмотра
Пригласить эксперта
Ответы на вопрос 5
@asmelnik
Это поможет?
https://docs-python.ru/standart-library/paket-mult...
Запускаете как 2 независимых процесса и ждете пока оба завершатся.
Ответ написан
Комментировать
miraage
@miraage
Старый прогер
Я с python, можно сказать, не работал толком, а лишь баловался для скриптов.
Такое что-то может подойдет.
await asyncio.gather(
  future1,
  future2
)


// edit

Ага, выглядит как аналог Promise.all в js https://docs.python.org/3/library/asyncio-task.htm...
Там есть Note, что лучше использовать asyncio.TaskGroup
Ответ написан
@Karabassss
Для такой цель можно использовать модуль concurrent.futures, и тогда это будет выглядеть примерно вот так

import subprocess
from concurrent.futures import ThreadPoolExecutor

def run_command(command):
    subprocess.run(command)

subprocess.run(["command1"]) # начало выполнения скрипта

# Создаем ThreadPoolExecutor с 2 потоками
with ThreadPoolExecutor(max_workers=2) as executor:
    executor.submit(run_command, ["command2"]) # 2 и 3 выполнить одновременно (параллельно)
    executor.submit(run_command, ["command3"])

subprocess.run(["command4"]) # начинает выполнять эту команду после выполнения команд 2 и 3
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега Python
software engineer
Можно в качестве команды вызвать многострочник в шелле, или вообще отдельный шелл скрипт, где пишем, например так:

#!/user/bin/bash
mycommand1 &
mycommand2 &
wait
echo "completed"


В питоне я думаю можно написать однострочник:

coproc mycommand1; coproc mycommand2;wait;echo "completed"
Ответ написан
Комментировать
Hackerman1
@Hackerman1
17 лет, плохое зрение.
Используй библиотеку threading. Она позволяет создавать потоки. Можешь их синхронизировать как тебе удобно. Из вариантов передачи данных между потоками я знаю только Queue библиотеку. Можешь использовать её. Если у тебя между выполнением двух команд есть ощутимая задержка, можешь методом перебора вычислить её и ждать это время, чтобы запустить примерно одновременно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы