Как использовать Python3 Многопроцессорность для запуска нескольких команд Bash - PullRequest
0 голосов
/ 23 апреля 2020

Я создал bash скрипт для автоматизации нескольких инструментов. Этот bash скрипт принимает строку в качестве входных данных и выполняет несколько задач. Структура скриптов выглядит как

#!/bin/bash
tool1 $1
tool2 $1
tool3 $1
tool4 $1
tool5 $1

Я хочу использовать Python3 Многопроцессорность для одновременного / параллельного запуска n инструментов для ускорения процесса. Как это можно сделать в Python?

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Пожалуйста, используйте multiprocessing и subprocess. При использовании специального сценария оболочки, если его нет в переменной PATH, используйте полный путь к сценарию. Если ваш скрипт находится в той же папке, что и скрипт python, используйте ./script.sh в качестве команды.

Также убедитесь, что есть exe c разрешение для сценария, который вы запускаете

from multiprocessing import Pool
import subprocess

def run_script(input):
    (command,arg_str)=input
    print("Starting command :{} with argument {}".format(command, arg_str))
    result = subprocess.call(command+" "+arg_str, shell=True) 
    print("Completed command :{} with argument {}".format(command, arg_str))
    return result

with Pool(5) as p: # choose appropriate level of parallelism
    # choose appropriate command and argument, can be fetched from sys.argv if needed
    exit_codes = p.map(run_script, [('echo','hello1'), ('echo','hello2')])
    print("Exit codes : {}".format(exit_codes))

. Вы можете использовать коды завершения для проверки статуса завершения. Пример вывода:

Starting command :echo with argument hello1
Starting command :echo with argument hello2
hello1
hello2
Completed command :echo with argument hello1
Completed command :echo with argument hello2
Exit codes : [0, 0]

Другой способ сделать это (без python) - использовать GNU Parallel. Приведенная ниже команда выполняет то же самое, что и приведенный выше скрипт python.

parallel -k echo ::: 'hello1' 'hello2'
0 голосов
/ 23 апреля 2020

Вы можете использовать multiprocessing.pool.Pool вместе с os.system следующим образом:

import sys
import os 
import multiprocessing

tools = ['tool1', 'tool2', 'tool3', 'tool4', 'tool5']
arg1 = sys.argv[1]

p = multiprocessing.Pool(len(tools))
p.map(os.system, (t + ' ' + arg1 for t in tools))

Это запустит len(tools) параллельных процессов, которые будут выполняться os.system('toolN arg').

В общем, вам не нужен Pool(len(tools)), поскольку он плохо масштабируется, если вы запускаете больше процессов, чем число ядер, доступных на вашем компьютере, поэтому вам следует сделать следующее. Pool() вместо. Это по-прежнему будет запускать каждый инструмент, но одновременно будет выполнять не более N.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...