Запускать внешнее приложение на нескольких процессорах - PullRequest
0 голосов
/ 21 ноября 2019

В настоящее время у меня есть программа, которая использует subprocess.Popen, чтобы открыть исполняемый файл и передать аргумент - эквивалентно запуску ./path/to/file args в Linux.

Это работает очень хорошо, но мне нужно выполнить этот файл поверх1000 раз и в настоящее время это делается по одному на одном процессоре. Я хочу иметь возможность выполнять этот файл, например, в наборах по 8, так как у меня 8-ядерный ПК.

Я пробовал следующее:

bolsig = ("/home/rdoyle/TEST_PROC/BOLSIG/bolsigminus")

infile_list = glob.glob(str(cwd)+"/BOLSIG Run Files/run*")

cmds_list = [[bolsig, infile] for infile in infile_list]
procs_list = [Popen(cmd) for cmd in cmds_list]           

for proc in procs_list:        
    proc.wait() 

Но это пытаетсявыполнить все 1000 команд одновременно.

У кого-нибудь есть предложения?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2019

Мне нравится concurrent.futures для таких простых случаев, как этот, это так просто и при этом очень эффективно.

import os
import glob
from concurrent import futures
from subprocess import Popen

optim = ("/usr/bin/jpegoptim")
img_path = os.path.join(os.path.abspath(os.path.curdir), 'images')

file_list = glob.glob(img_path+'/*jpg')

def compress(fname):
    Popen([optim, fname, '-d', 'out/', '-f'])

ex = futures.ThreadPoolExecutor(max_workers=8)
ex.map(compress, file_list)

Отличное вступление в PyMOTW Дуга Хеллмана. https://pymotw.com/3/concurrent.futures/

0 голосов
/ 21 ноября 2019

Вы можете использовать модуль Python multiprocessing и его multiprocessing.pool.Pool -> https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing

...