[python] multiprocessingにおける共有変数の使い方

前回の投稿でpythonにおけるmultiprocessingの基本的な使い方をまとめました. multiprocessingでは複数のプロセスで同時に処理するので基本的に同一変数のメモリの共有は行いません。しかし、実際に使用する時は同一の処理を複数プロセスで行い一つの変数に格納したいことが多いと思います. このような場合はプロセス間で共有の変数を定義することで解決することができます.今回はmultiprocessingにおける共有変数の使い方についてまとめていきます.

共有変数を定義する方法

共有変数を定義する時はValueクラスかArrayクラスを用います. 単純にスカラー値を共有したい時はValueクラスを, 配列を共有したい時はArrayクラスを用いて変数を定義します.また定義した共有変数をPoolクラスのinitializerに引き渡すことでプロセス開始時に変数の共有を行います. 今回は配列を用意して配列の値をインデックスごとにマイナスにする処理を並列処理させました.

ValueクラスやArraykクラスで指定したdは型のタイプで今回はdouble型です。他にもf(float)やi(int)が指定可能です。function内でshared_count.acquire()とありますがこれは変数のアクセスをロックするメソッドで, プロセス間で同一の変数の書き換えを行う場合は処理を始める前にロックしておかないと処理中に変数の値が他のプロセスによって書き換えられてしまうので気をつけてください.

実行結果としては11805-11808の四つのサブプロセスで正しく実行できていることが分かります.

まとめ

今回はpythonのmultiprocessingにおいて共有変数を定義し複数プロセス間で同一の変数にアクセスする方法をまとめました. 複雑な処理になってくるとロックする位置などを間違えると処理結果などが変わってきてしまうため少し面倒ですが使いこなせばかなり便利だと思います. まだまだ使い方の理解が不十分なので分かったことがあったらまとめていきたいと思います.

Published by

ryousuke nasuno

東京都市大学工学研究科の修士2年の学生です. Deep Learningを活用した研究をしています.

Leave a Reply

Your email address will not be published. Required fields are marked *