【Python】並列処理する(備忘録)


やりたいこと

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.')