【python】multiprocessingでのクラス内変数の共有
未分類
Lastmod: 2021-05-08

はじめに

pythonのおける並列処理の有名なライブラリにmultiprocessingというものがあります。このmultiprocessingを用いて並列処理を実行している時にクラス内の変数を共有したい時があったのですが、なかなかうまくいかずに詰まっていたとき失敗例と成功例を紹介します。

内容

  1. 失敗例
  2. 成功例

失敗例

成功例のみ知りたい方は次節の成功例をご覧ください。

以下のようなクラスがあると仮定します。このプログラムではクラス内変数であるself.countを並列処理の実行中に書き換えるといったものです。これを実行すると並列処理内で書き換えたself.countが100になっていそう?

from multiprocessing import Process
import time

class Test:
    def __init__(self):
        self.count = 0

    def process(self):
        print('Run process')
        self.count = 100 #countを書き換え

    def main(self):
        print(self.count)
        p = Process(target=self.process)
        p.start() #プロセスの実行
        time.sleep(1) #特に必要ないですが念の為。
        print(self.count) #ここで確認するとself.count=100になってるはず...

if __name__ == "__main__":
    t = Test()
    t.main()

実行すると次のように。うん、書き換えれてない。

$ python test.py
0
Run process
0

成功例

続いて成功例です。結論からいうと、multiprocessingにあるValueを使うとクラス内変数の共有が可能になります。

from multiprocessing import Process, Value
import time

class Test:
    def __init__(self):
        self.count = Value('i', 0)

    def process(self):
        print('Run process')
        self.count.value = 100 #countを書き換え

    def main(self):
        print(self.count.value)
        p = Process(target=self.process)
        p.start()
        time.sleep(1) #特に必要ないですが念の為。
        print(self.count.value)

if __name__ == "__main__":
    t = Test()
    t.main()

実行すると次のように書き換えれています。

$ python test2.py
0
Run process
100