0

Pythonで複数の引数を持つ単一の外部プログラムを実行しようとしています。そのために私は次のようなものを使用します

for i in range(10):
    subprocess.Popen(["./foo", i])

プロセスは完全に独立しています。それにもかかわらず、それらは私の Mac OS X の単一のコアでしか実行されません。プロセスをすべてのコア (私の場合は 4 つ) に分散する簡単な方法はありますか?

4

2 に答える 2

2

multiprocessingモジュールを見てみましょう。

于 2012-08-13T09:36:14.070 に答える
1

以下は、マルチプロセッシングを使用して複数の画像を並行して変換するプログラムの例です。

"""Convert DICOM files to PNG format, remove blank areas. The blank erea
   removal is based on the image size of a Philips flat detector. The image
   goes from 2048x2048 pixels to 1574x2048 pixels."""

import os
import sys
import subprocess
from multiprocessing import Pool, Lock

globallock = Lock()

def checkfor(args):
    """Make sure that a program necessary for using this script is
    available."""
    if isinstance(args, str):
        args = args.split()
    try:
        f = open('/dev/null')
        subprocess.call(args, stderr=subprocess.STDOUT, stdout=f)
        f.close()
    except:
        print "Required program '{}' not found! exiting.".format(args[0])
        sys.exit(1)

def processfile(fname):
    """Use the convert(1) program from the ImageMagick suite to convert the
       image and crop it."""
    size = '1574x2048'
    args = ['convert', fname, '-units', 'PixelsPerInch', '-density', '300',
            '-crop', size+'+232+0', '-page', size+'+0+0', fname+'.png']
    rv = subprocess.call(args)
    globallock.acquire()
    if rv != 0:
        print "Error '{}' when processing file '{}'.".format(rv, fname)
    else:
        print "File '{}' processed.".format(fname)
    globallock.release()

def main(argv):
    """Main program.

    Keyword arguments:
    argv -- command line arguments
    """
    if len(argv) == 1:
        path, binary = os.path.split(argv[0])
        print "Usage: {} [file ...]".format(binary)
        sys.exit(0)
    checkfor('convert')
    p = Pool()
    p.map(processfile, argv[1:])
    p.close()


## This is the main program ##
if __name__ == '__main__':
    main(sys.argv)
于 2012-08-13T09:44:45.363 に答える