アクサンの場合

Python3初心者が段々上達するログ

Pythonで並列処理入門

入門編でやれること

リストを順に処理するときに並列で処理したい!

data_list = ["a", "b", "c", "d"]

for i in data_list:
    #Do something

こういうのをコア数に応じて並列で処理してさくっと終えたい。ときに使える。

どうやるか

from multiprocessing import Pool

data_list = ["a", "b", "c", "d"]
def wrapper_main(nakami):
    #Do something

myprocess = Pool()
myprocess.map(wrapper_main, data_list)
myprocess.close()

実際に書く量はほとんど変わらない。もちろん、ひとつのリストの中身だけで完結することが大前提(並列処理って言ってるしね)。


少しずつ見ていきたい。

from multiprocessing import Pool

これで呼び出し

def wrapper_main(nakami):  
    #Do something

本来やりたい処理をここに入れる。変数nakamiはdata_listの中身のこと。ラッパーを書くときは、リストを引数に与えるのではなくリストの中身を与えた場合の処理を書く。

myprocess = Pool()
myprocess.map(wrapper_main, data_list)
myprocess.close()

これはほとんどおまじない。Poolの中に例えばPool(12)とすると12コアだけ使ってくれる。何も入れないとフルで使うことになる。 肝心なのはプロセスオブジェクト.map(関数名, リスト)という使い方。

これさえ守ればあっという間にマルチプロセスができる。

コアごとに違う処理を押し付けたい場合やwrapperの引数が二次元リストだったり複数あったりする場合は中級編として既存のブログ等を参考にすればできる。マルチスレッドとマルチプロセスの違いなども割愛。