Pythonのmultiprocessing
モジュールは、threading
モジュールに似たAPIを提供しながら、プロセスベースの並列処理をサポートしています。このモジュールの中でも、Pool
オブジェクトは特に注目に値します。Pool
オブジェクトは、複数の入力データに対して、サブプロセス群に入力データを分配 (データ並列) して関数を並列実行するのに便利な手段を提供します。
以下に、Pool
を用いたデータ並列の基礎的な例を示します:
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3]))
このコードを実行すると、標準出力に[1, 4, 9]
が出力されます。
また、Pool.map()
を使うと、親プロセスはmapが結果を返すまでブロックされます。これは、Pool.map()
が親プロセスをブロックする副作用とも言えます。
さらに、Pool.join()
は、すべてのジョブが終了するのを待ってからプールを終了し、効果的にプールをクリーンアップします。したがって、親プロセスがブロックされるのは、Pool.join()
が行っていることの副作用です。
以上の情報を踏まえて、Pythonのmultiprocessing.Pool
を適切に使用することで、データ並列処理を効率的に行うことができます。