Up

Pythonマルチプロセシング

現代のPCはマルチプロセシングがサポートされているので、大きな計算を効率的に行うことができる。マルチプロセシングの簡単な例を本ウェブサイトの後半にあげたリスト1に示す。リスト1のスクリプトでは、リスト2の3つの関数を呼び出して同時に実行している。3つの関数それぞれはtkinterパッケージのTkクラスで作成したウィンドウを表示するものである(図1)。.

図1

 

これらのウィンドウは10秒後に消えて、プログラムの実行終了となる。

マルチプロセシングは次のコードによって実行されている。

    pool = Pool()

    Results = pool.map(func_r, params)

このコードの実行は、次の条件が満たされていることが必要である。

__name__ == '__main__'

上の条件を無視して実行すると、プログラムはハングアップする。

マルチプロセシングで呼び出される関数func_rは、リスト2で宣言されている。マルチプロセシングで呼び出される関数は、引数の個数が1個である。この1個の引数を項目とするリストをmapの実引数として設定すると、リストの各項目に対応して関数func_rのプロセスが実行される。リスト2の関数func_rでは、リストの項目である辞書のキーIDの値に応じて、呼び出す関数が選ばれている。

マルチプロセシングの関数mapの関数値は、マルチプロセシングで実行された各関数の関数値を項目とするリストである(図2)。

図2

 

リスト1および2のファイルは、圧縮ファイルにまとめた。

 

リスト1. Main.py

from multiprocessing.pool import Pool

from submodule import *

 

print('Started...')

params_t = {'ID': 0, 'r':0, 'g':0, 'b':0}

params = []

for iproc in range(3):

    p_t = params_t.copy()

    p_t['ID'] = iproc + 1

    if iproc == 0:

        p_t['r'] = 255

    elif iproc == 1:

        p_t['g'] = 255

    else:

        p_t['b'] = 255

    params.append(p_t)

   

if __name__ == '__main__':

    pool = Pool()

    Results = pool.map(func_r, params)

 

    print(Results)

 

 

リスト2. Submodule.py

from tkinter import *

import time

 

def rgb2str(r, g, b):

    return '#{0:0>2x}{1:0>2x}{2:0>2x}'.format(r,g,b)

 

def func1(r, g, b):

    root = Tk()

    c = Canvas(root, width = 100, height = 200, background = rgb2str(0, 255, 255))

    c.pack()

    for i in range(10):

        c.create_rectangle(0, 0, 100, 200, outline = rgb2str(r, g, b), fill = rgb2str(r, g, b))

        c.update()

        r = 255 - r

        g = 255 - g

        b = 255 - b

        time.sleep(1)

 

    root.destroy()

 

    return 'func1'

       

 

def func2(r, g, b):

    root = Tk()

    c = Canvas(root, width = 200, height = 100, background = rgb2str(0, 255, 255))

    c.pack()

    for i in range(10):

        c.create_rectangle(0, 0, 200, 100, outline = rgb2str(r, g, b), fill = rgb2str(r, g, b))

        c.update()

        r = 255 - r

        g = 255 - g

        b = 255 - b

        time.sleep(1)

 

    root.destroy()

 

    return 'func2'

 

 

def func3(r, g, b):

    root = Tk()

    c = Canvas(root, width = 150, height = 150, background = rgb2str(0, 255, 255))

    c.pack()

    for i in range(10):

        c.create_rectangle(0, 0, 150, 150, outline = rgb2str(r, g, b), fill = rgb2str(r, g, b))

        c.update()

        r = 255 - r

        g = 255 - g

        b = 255 - b

        time.sleep(1)

 

    root.destroy()

 

    return 'func3'

 

def func_r( params ):

    results = None

    if params['ID'] == 1:

        results = func1(params['r'], params['g'], params['b'])

    elif params['ID'] == 2:

        results = func2(params['r'], params['g'], params['b'])

    else:

        results = func3(params['r'], params['g'], params['b'])

       

    return results, params['ID']

 

 

Up