###前提・実現したいこと
Python3.4でmultiprocessingモジュールを使ったマルチプロセスのプログラムを書いています。
multiprocessingのrun()メソッド内の挙動が、思った通りに動作してくれません。
###発生している問題
run()メソッド内でメンバ変数を書き換えても、反映されないように見えます。ソースコードを見てください。
###該当のソースコード
python
1import multiprocessing as mp 2import sys 3import time 4import os 5 6class TestProcess(mp.Process): 7 def __init__(self, v): 8 super(TestProcess, self).__init__() 9 self.value = v 10 self.queue = mp.Queue() 11 12 def set_value(self, v): 13 # メインプロセス側でvalueの値を設定するための関数 14 self.value = v 15 16 def value_into_queue(self): 17 # メインプロセス側でvalueをキューに入れるための関数 18 self.queue.put(self.value) 19 20 def run(self): 21 print("=== start sub process===") 22 self.value = -1 23 #self.queue.put(self.value) 24 25if __name__ == "__main__": 26 print("=== start main thread (main) ===") 27 p1 = TestProcess(0) 28 p1.start() 29 p1.join() 30 31 p1.value_into_queue() # p1のvalueをキューに入れる 32 print(p1.queue.get()) # p1のvalueを取り出す 33 time.sleep(1) 34 35 p1.set_value(100) # p1のvalueをセットする 36 p1.value_into_queue() # p1のvalueをキューに入れる 37 print(p1.queue.get()) # p1のvalueを取り出す 38 39 print("=== end main thread (main) ===") 40
run()メソッド内でself.value = -1をしているので最初に取り出される数値は-1になるはずです。しかし実行結果は次のようになりました。
=== start main thread (main) === === start sub process=== 0 100 === end main thread (main) ===
###試したこと
run()メソッド内を次のように書き換えたところ、意図するような動作にはなりました。
python
1 def run(self): 2 print("=== start sub process===") 3 self.value = -1 4 self.queue.put(self.value)
以下は結果です。最初に-1を取り出せています。
=== start main thread (main) === === start sub process=== -1 0 === end main thread (main) ===
なぜこのような違いが起きるのでしょうか?
なぜ最初のプログラムでは、-1を取り出せないのでしょうか?
よろしくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
python3.4、OSはRaspbianです
回答1件
あなたの回答
tips
プレビュー