Raspberry Pi 3 & Python 開発ブログ☆彡

Raspberry Pi 3の使い方、設定をわかりやすく解説。Raspberry Pi3 Model B(Element14版)、Raspbian 8.0(NOOBS Ver1.9.2)を使用して開発中。

【スポンサーリンク】

multiprocessingのValue型、Array型変数の使い方

【スポンサーリンク】

前回、multiprocessingモジュールで並列処理をする方法を紹介しました。multiprocessingモジュールではプロセスが分かれるため、プロセス間で変数のやり取りをするには少し工夫が必要です。工夫と言っても、簡単です。ちゃんとValue型、Array型という便利なモジュールが用意されています。今回は、Value型、Array型モジュールの使い方を紹介したいと思います。

Value型、Array型の使い方

前回の紹介したmultiprocessingのサンプルコードを変更する形でValue型、Array型変数の使い方を紹介します。

 

◆Value型、Array型モジュールのインポート

下記のコードでValue型、Array型モジュールをインポートします。

from multiprocessing import Array,Value

 

◆Value型の変数の作成

testValue = Value('i',1) ⇒  'i' は符号付整数の単一の変数を生成、初期値:1

              

◆Array型の変数の作成

testArray = Array('d',range(2))  ⇒  'd'は倍精度浮動小数の配列変数を定義 配列数:2

 

◆main.pyの説明

 Value型とArray型の変数を宣言し、Test1Worker、Test2Workerのそれぞれのクラスに変数を渡します。その後、サブプロセスを起動します。

 

◆test1worker.pyの説明

 Value型とArray型変数に値をセットします。

 

◆test2worker.pyの説明

Test1Wokerクラスでセットした値を読み、表示します。

 

 上記の内容で、Test1WorkerクラスとTest2Wokerクラスで変数の共有ができていることを確認します。

◇main.pyのコード

from test1worker import Test1Worker
from test2worker import Test2Worker
from multiprocessing import Array,Value
def main():
testValue = Value('i',1)
testArray = Array('d',range(2))
jobs = [
Test1Worker(5,testValue,testArray),
Test2Worker(10,testValue,testArray)
]

for j in jobs:
j.start()
if __name__ == '__main__':
main()

 

◇test1worker.pyのコード

import multiprocessing
import time
class Test1Worker(multiprocessing.Process):
def __init__(self,interval,testvalue,testArray):
super(Test1Worker, self).__init__()
self.interval = interval
self.testvalue = testvalue
self.testArray = testArray

def run(self):
cnt = 0
while True:
time.sleep(self.interval)
cnt = cnt + 1
print "Test1Woker:ValueSet"
self.testvalue.value = cnt
self.testArray[0] = cnt
self.testArray[1] = cnt * 10

 

 ◇test2worker.pyのコード

import multiprocessing
import time
class Test2Worker(multiprocessing.Process):
def __init__(self,interval,testvalue,testArray):
super(Test2Worker, self).__init__()
self.interval = interval
self.testvalue = testvalue
self.testArray = testArray

def run(self):
while True:
time.sleep(self.interval)
print "Test2Woker:ValueRead"
print 'testValue:'+str(self.testvalue.value)
print 'testArray[0]'+str(self.testArray[0])
print 'testArray[1]'+str(self.testArray[1])

補足です。Value型に値を入れたり、値を入れるときは変数名.valueと書く必要があることです。変数名だけ書くと、正常に動きませんのでご注意ください。

 

動作確認

Test1Workerクラスでセットした値が表示されていると思います。表示しているのは、Test2Workerクラスですので、Test1WorkerとTest2Workerの異なるプロセス間で変数が共有されていることがわかります。

 

次回は、もうひとつの便利なQueue型について紹介します。