ブログ

割とコンピュータよりの情報をお届けします。

2019/3/1

Pythonのmultiprocessingの例

Pythonではmultithreading よりもmultiprocessingの方がCPUのコアを有効に使用できる.

Pythonではマルチスレッドのプログラムが簡単.
よほどのことがない限り,異常は発生してなかったが,
GILのためという理由で,なかなか性能が発揮できない場面が大かった.

おそらくこの例が,マルチプロセスに直した場合になっている.

(これを作ったときには,nameに文字列以外を挿入して大失敗した.ちゃんと文字列を入れましょう)

import numpy as np
from multiprocessing import Process
import multiprocessing as mp

def calc(queue, i_range, arg1, arg2, arg3):
    print('Start: {}\r\n'.format(mp.current_process().name))
    a = arg1[i_range] + arg2[i_range];
    b = arg2[i_range] + arg3[i_range];
    c = arg3[i_range] + arg1[i_range];
    queue.put([a, b, c])

if __name__ == '__main__':
    x = np.linspace(0, 10000, 10000);
    y = np.linspace(10000, 0, 10000);
    z = np.linspace(0, 10000, 10000) - 5000;

    mp_size = 4
    ps = [];
    queue = mp.Queue()
    results = dict()
    for i in range(mp_size):
        ps.append(mp.Process(target=calc, args=(queue, range(x.shape[0]*i//mp_size, x.shape[0]*(i+1)//mp_size), x, y, z), name="{}".format(i+1)))
        
    for p in ps:
        p.start()
    
    for i in range(mp_size):
        results[i] = queue.get();

    
    a = 0;
    b = 0;
    c = 0;
    for i in range(mp_size):
        a += np.asscalar(np.sum(results[i][0]));
        b += np.asscalar(np.sum(results[i][1]));
        c += np.asscalar(np.sum(results[i][2]));
    
    
    print('{},{},{}'.format(a, b, c))

なんの問題もなく終了するときは良いが,強制終了がかかると子プロセスが残る問題が生じる.この件は次の記事で扱う.

≫ Read More

2019/03/01 コンピュータ   TakeMe
Tag:Python