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

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

【スポンサーリンク】

multiprocessingモジュールの使い方

【スポンサーリンク】

今回はmultiprocessingモジュールの使い方を紹介したいと思います。並列処理を行う場合、このモジュールはとても便利です。multiprocessingモジュールはthreadingモジュールと似ているのですが、サブプロセスを生成して処理を行えるので、複数のCPUやCPUコアの性能を生かすことができます。

 

multiprocessingモジュールの使い方

まず、multiprocessing.Processというクラスを継承してクラスを作成します。こうすることで並列処理(サブプロセス)で実行できるようになります。今回は、Test1WorkerとTest2Workerという2つのクラスを並列処理(サブプロセス)で実行するサンプルコードを紹介します。

 

◆main.pyの説明

Test1WorkerクラスとTest2Workerクラスをnewし、サブプロセスを起動します。

 

◆test1worker.py

Test1Workerクラスが実装されています。5秒間に1回、"Test1Woker"と表示します。

 

◆test2worker.py

Test2Workerクラスが実装されています。10秒間に1回、"Test2Woker"と表示します。

 

◇main.pyのコード◇

from test1worker import Test1Worker
from test2worker import Test2Worker

def main():

    jobs = [
        Test1Worker(5),
        Test2Worker(10)
        ]
 
    for j in jobs:
        j.start()
    for j in jobs:
        j.join()

if __name__ == '__main__':
    main()

 

◇test1woker.py のコード

import multiprocessing
import time

class Test1Worker(multiprocessing.Process):

    def __init__(self,interval):
        super(Test1Worker, self).__init__()
        self.interval = interval
 
    def run(self):
        while True:
            time.sleep(self.interval)
            print "Test1Woker"

 

◇test2woker.py のコード

import multiprocessing
import time

class Test2Worker(multiprocessing.Process):

    def __init__(self,interval):
        super(Test2Worker, self).__init__()
        self.interval = interval

    def run(self):
        while True:
            time.sleep(self.interval)
            print "Test2Woker"

補足で説明します。main.pyでは、引数:"5"を入れて、Test1Workerクラスをnewしています。続けて、引数:"10"を入れて、Test2Workerクラスをnewしています。それぞれをjobs配列に追加しています。for文でjobs配列に追加されているすべてのクラスに対してstart()メゾットを実行し、サブプロセスを起動しています。

mainでstart()メゾットが呼ばれると、Test1Worker、Test2Wokerクラスのrun()メゾットが自動的に呼ばれます。

動作確認

main.pyを実行すると5秒間隔で”Test1Woker”、10秒間隔で"Test2Woker”と表示され、並列動作していることが確認できます。また、psコマンドを実行すると、プロセスもちゃんと3つ生成されていることがわかります。

この方法を使えば、通信クラス、センサークラス等、機能ごとにクラスを作り、それを並列実行することができます。クラスでまとまっていますので、コードも動作もわかりやすいと思います。

次回はプロセス間で変数を共有する方法を紹介したいと思います。