Заставить мой python для l oop работать параллельно - PullRequest
0 голосов
/ 31 марта 2020

У меня есть python для l oop, который выполняет скрипт bash, как показано ниже (я упростил его, добавив только то, что нужно показать), мне нужно, чтобы он выполнил все эти bash сценарии в то же время, что и для l oop, но ожидают, пока все они не будут завершены, прежде чем продолжить в серии. Скрипт bash это единственная часть, которую я хочу запустить параллельно. Это делает то же самое для l oop, что должно быть сделано последовательно. Возможно ли это?

Следующее ниже работает последовательно. Нет параллельного выполнения скрипта из-за .wait (). Если я удаляю .wait (), это почти сразу же приводит к ошибкам, и все, что находится вниз по течению, больше не работает, как ожидалось.

for i in range(0, len(10)):

    path = 'folder_'+'%02d'%i
    os.mkdir(path)
    os.chdir(path)

    command = 'bash dosomething'
    subprocess.Popen(command, shell=True).wait()

    THINGS IN SERIES

    os.chdir('../')

Ответы [ 2 ]

0 голосов
/ 31 марта 2020
import Parallel, delayed
import multiprocessing

counts = range(10) 
def sub_command(i):
    path = 'folder_'+'%02d'%i
    os.mkdir(path)
    os.chdir(path)

    command = 'bash dosomething'    
    subprocess.Popen(command, shell=True).wait()
    os.chdir("../")

cpu_cores = multiprocessing.cpu_count()

Parallel(n_jobs=cpu_cores)(delayed(sub_command)(i) for i in counts )
0 голосов
/ 31 марта 2020

Подождите, пока вы запустили все подпроцессы. Вместо изменения текущего рабочего каталога в родительском, установите его для дочернего.

processes = []
for i in range(0, len(10)):
    path = 'folder_'+'%02d'%i
    os.mkdir(path)
    command = ('bash dosomething')
    processes.append(subprocess.Popen(command, shell=True,
        cwd=path))

# you can do other things here

for p in processes:
    p.wait()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...