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

