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))
なんの問題もなく終了するときは良いが,強制終了がかかると子プロセスが残る問題が生じる.この件は次の記事で扱う.
タグ:Python