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

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

【スポンサーリンク】

multiprocessingのQueue型変数の使い方

【スポンサーリンク】

前回は、プロセス間で共有して使えるValue型、Array型を紹介しました。今回は、プロセス間で使用できるQueue型について説明したいと思います。このQueue型もとても便利です。

 

Queue型の使い方

前々回のサンプルコードを修正する形でQueue型変数の使い方を紹介します。

 

◆Queue型モジュールのインポート

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

from multiprocessing import Queue

 

◆Queue型の変数の作成

q = Queue()

 

◆main.pyの説明

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

 

◆test1worker.pyの説明

Queue型変数に値をセットします。

 

◆test2worker.py

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

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

 

◇main.pyのコード

from test1worker import Test1Worker
from test2worker import Test2Worker
from multiprocessing import Queue
def main():
    q = Queue()     jobs = [         Test1Worker(5,q),
        Test2Worker(q)
    ]
    for j in jobs:
        j.start()
if __name__ == '__main__':
    main()

 

◇test1worker.pyのコード

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

    def run(self):
        while True:
            time.sleep(self.interval)             print "Test1Woker:QueuePut"
            self.q.put(("TEST1","TEST2"))  

 

◇test2worker.pyのコード

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

    def run(self):
        while True:             data = self.q.get()
            print "Test2Woker:QueueReadValue"
            print 'Queue[0]:'+data[0]
            print 'Queue[1]:'+data[1]

補足説明をします。q.put()で値を入れ、g.get()で値を取り出します。q.get()はq.put()で値が入るのを待っています。qに何か値が入ると自動的にq.get()関数が呼ばれ、それ以降の処理が実行されます。ポーリングをする必要がないので、とても使いやすいですね。

動作確認

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

 

これでプロセス間で自在に変数のやりとりができるようになりました。multiprocessingモジュールはとても便利なので、習得して損はないでしょう。