やりたいこと
pythonで並列処理したい。multiprocessingをインポートしたらいいらしい。サンプルを作成してイメージを図にして備忘録として残す。
どうやるか
並列処理するため、まず以下を決める。
- 並列処理を行う関数
- 並列処理を行う関数に使う引数のリスト
今回、引数に入れた数値を10万回足して100万で割った値を出力する関数を用意した。これを1から順番に30までの数値で計算を行う。イメージとしては以下の画像の感じ。
サブプロセスに直接使いたい関数を当てはめるのではなく、引数のリストを使ってfor文で目的の関数を回すようにした。
サンプルコードは以下の通り
sample_multi.py
from multiprocessing import Process
# 並列実行したい関数
def test(a):
b = 0
for i in range(100000):
b += a
print(b/1000000)
# サブプロセス:引数リストのfor文で回して目的の関数を実行
def multi_run(tasks):
for task in tasks:
test(task)
if __name__ == "__main__":
# 処理データ:[1,2,...30]
l = range(1,31)
# 並列処理プロセス数
multi = 3
# 並列処理用のサブプロセス格納リスト
p = []
# 各サブプロセスに与える引数を格納するリスト
task_list = [[] for i in range(multi)]
# 引数のリストを作成
for i in range(0, len(l), multi):
for p_num, n in enumerate(range(i, i+multi)):
if n >= len(l):
break
task_list[p_num].append(l[n])
# サブプロセスへ引数リストを割り当てて並列処理開始
for i in range(multi):
p.append(Process(target=multi_run, args=(task_list[i],)))
p[i].start()
# 並列処理終了待ち
for i in range(multi):
p[i].join()
print('p['+str(i)+'] finished.')