1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-07-18

やりたいこと

pythonで並列処理したい。multiprocessingをインポートしたらいいらしい。サンプルを作成してイメージを図にして備忘録として残す。

どうやるか

並列処理するため、まず以下を決める。

  • 並列処理を行う関数
  • 並列処理を行う関数に使う引数のリスト

今回、引数に入れた数値を10万回足して100万で割った値を出力する関数を用意した。これを1から順番に30までの数値で計算を行う。イメージとしては以下の画像の感じ。

スクリーンショット 2021-07-18 16.04.58.png

サブプロセスに直接使いたい関数を当てはめるのではなく、引数のリストを使って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.')
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?