Raspberry Piのpythonでmultiprocessingから子プロセス生成し共有メモリが使えたので備忘録
前回、os.fork()で子プロセスを作る手法を書きましたが、共有メモリを作る手法にたどり着きませんでした。結局ちょっと複雑な方法を紹介せざるおえません。と言うわけでさらに備忘録です。
それは、multiprocessingから共有メモリとして使えるArrayとValueを利用する方法です。multiprocessingの使い方としては「PyMOTW>>multiprocessing の基本」や「PY習>>multiprocessingモジュール(1)~(4)」、「Raspberry Pi 3 & Python 開発ブログ☆彡>>multiprocessingモジュールの使い方」が参考となると思います。
ValueとArrayの使い方は「Raspberry Pi 3 & Python 開発ブログ☆彡>>multiprocessingのValue型、Array型変数の使い方」を参考にしています。
当方は、具体的に共有メモリを子プロセス相互ででどのように使えるのかをさらにソースに書いてみました。と、言うわけでちょっと難解なソースと出力結果になっていますがご了承ください。
前回でも示していますが当方のRaspberry Piでは現在のところpython3.4.2です。
ソースは以下のとおりです。ファイル名は「heiretu_kyouyuumemory01.py 」です。
ソースは以下のとおりです。ファイル名は「heiretu_kyouyuumemory01.py 」です。
import multiprocessing
import time
import random
from multiprocessing import Array,Valueclass Test1Worker(multiprocessing.Process):#クラスの定義、スーパークラスの継承、multiprocessing.Processにより子プロセスの設定def __init__(self,interval,testvalue,testArray):#__init__メソッドを再定義
super(Test1Worker, self).__init__()#Test1Workerクラスのスーパークラスメソッド(multiprocessing.Process)の__init__の呼び出しself.interval = interval#アトリビュートをintervalで初期化(何をしているのかは当方には不明)
self.testvalue = testvalue#アトリビュートをtestvalueで初期化
self.testArray = testArray#アトリビュートをtestArrayで初期化def run(self):#クラスを呼び出したときに自動実行
cnt = 0#cnt変数を定義
for i in range(10):#10回ループ
time.sleep(self.interval)#self.interval(1)秒プログラムを停止
cnt = cnt + 1print("Test1Woker")#Test1Workerクラスが動作している事を確かめるため標準出力
print("testArray[2]"+str(self.testArray[2]))#Test2Workerクラスで代入されたランダムなself.testArray[2]配列共通メモリより数値を標準出力
self.testvalue.value = cnt#self.testvalue.value共通メモリに値を代入
self.testArray[0] = cnt#self.testArray[0]配列共通メモリに値を代入
self.testArray[1] = cnt * 10#self.testArray[1]配列共通メモリに値を代入
class Test2Worker(multiprocessing.Process):#Test1Workerクラスと同じ#初期化はTest1Workerクラスと同じ
def __init__(self,interval,testvalue,testArray):
super(Test2Worker, self).__init__()self.interval = interval
self.testvalue = testvalue
self.testArray = testArraydef run(self):#クラスを呼び出したときに自動実行
for i in range(5):#5回ループ
time.sleep(self.interval)#self.interval(2)秒プログラムを停止
self.testArray[2] = random.random()#self.testArray[2]配列共通メモリに0以上1以下のランダムな数値を代入
print("Test2Woker")#Test2Workerクラスが動作している事を確かめるため標準出力
print("testValue:"+str(self.testvalue.value))#self.testvalue.valueを文字列化して標準出力
print("testArray[0]"+str(self.testArray[0]))#self.testArray[0]を文字列化して標準出力
print("testArray[1]"+str(self.testArray[1]))#self.testArray[1]を文字列化して標準出力
def main():#main()関数を作るtestValue = Value('i',1)#共通メモリを定義。'i'は整数型で初期値1。
testArray = Array('d',range(3))#配列共通メモリを定義。'd'倍精度浮動小数型で3配列。
jobs = [
Test1Worker(1,testValue,testArray),
Test2Worker(2,testValue,testArray)
]#各クラスのインスタンス化(サブプロセスとしての起動準備)jobs[0].start()#サブプロセスの起動
jobs[1].start()#サブプロセスの起動
if __name__ == '__main__':#プログラムの始まり
main()
実行はLXterminal(端末)から行います。フォルダーは適当なところに入れて実行もheiretu_kyouyuumemory01.py のあるフォルダーで行ってください。
$ python3 heiretu_kyouyuumemory01.py
Test1Woker
testArray[2]2.0
Test1Woker
testArray[2]2.0
Test2Woker
testValue:2
testArray[0]2.0
testArray[1]20.0
Test1Woker
testArray[2]0.2834102519384921
Test1Woker
testArray[2]0.2834102519384921
Test2Woker
testValue:4
testArray[0]4.0
testArray[1]40.0
Test1Woker
testArray[2]0.46171180248514454
Test1Woker
testArray[2]0.46171180248514454
Test2Woker
testValue:6
testArray[0]6.0
testArray[1]60.0
Test1Woker
testArray[2]0.5086290535569451
Test1Woker
testArray[2]0.5086290535569451
Test2Woker
testValue:8
testArray[0]8.0
testArray[1]80.0
Test1Woker
testArray[2]0.8492739507595825
Test1Woker
Test2Woker
testValue:9
testArray[2]0.5547918247876539
testArray[0]9.0
testArray[1]90.0
testArray[2]2.0と初期値がなぜか2.0になっています。その後0以上1以下のランダムな値が入っていますがTest1Workerクラスは1秒待ちにたいしてTest2Workerクラスは2秒待ちなのでtestArray[2]はTest1Worker→testArray[2]→Test1Worker→testArray[2]となるため同一数値が2回出てきます。
« Raspberry Piのpythonでos.fork()ができたので備忘録 | トップページ | 当方の資産増加率は8%弱に »
「パソコン・インターネット」カテゴリの記事
- logicool M720 Triathlon マルチデバイスマウスが故障(2022.08.20)
- UbuntuのFirefoxだと雑音が入る(未解決)(2022.02.13)
- イントロンのブログが60,000カウントを達成(2022.01.13)
- GrovePi+をRaspberry Pi 4に導入してみた(上手くゆかなかった)(2021.12.26)
- Raspberry Pi 4でVLCメディアプレイヤー起動時にフリーズがなぜか解消(2021.12.20)
« Raspberry Piのpythonでos.fork()ができたので備忘録 | トップページ | 当方の資産増加率は8%弱に »


コメント