在多个处理器上运行外部应用程序

时间:2019-11-21 09:54:42

标签: python concurrency multiprocessing subprocess popen

当前,我有一个使用subprocess.Popen打开可执行文件并传递参数的程序-等同于在Linux上运行./path/to/file args

这很好用,但是我必须执行1000次以上的文件,目前一次只能在一个处理器上完成一次。我希望能够以8套为一组执行此文件,因为我有一台8核PC。

我尝试了以下方法:

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 :(得分:0)

您可以使用Python multiprocessing模块及其multiprocessing.pool.Pool-> https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing

答案 1 :(得分:0)

对于像这样的简单情况,我喜欢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)

Doug Hellman的PyMOTW精彩介绍。 https://pymotw.com/3/concurrent.futures/