Python:マルチスレッド threading モジュール

どーもこんにちはKeita_Nakamori(´・ω・`)です。

最近はIoT関係で遊んでいるのですが、1つのラズパイで、複数のセンサーを扱うにはどうすればいいか考えていました。

普通のシングルスレッドで実行すると、PLCでいうところのスキャンタイムに依存することになります。

あるセンサーは高速でパルスをカウントしなければならない一方で、別のセンサーは、1秒周期でいいよとか、サンプリングタイムが全然違う場合はどうすればいいのか。

解決策として、マルチスレッドというものがあります。

それぞれのセンサーでサンプリングする関数を作って、それぞれを別々のスレッドとしてオブジェクト化して、メインスレッド内で実行するというやり方です。そうすると、それぞれのスレッドが互いに干渉することなく、あたかも2つのプログラムが同時に動いているような挙動を示します。

今回は、IOTというより、Pythonの基本なので、カテゴリーはPythonにしました。

では、やってみましょう。

まずは普通の関数を実行

まず最初に time_count()という関数を作って実行してみましょう。

1秒ごとに現在時間を出力しているだけのスクリプトです。

Pythonではthreadingモジュールから利用することができます。

結果:どうでしょう、これは普通ですよね。

次は、これをスレッド化して実行してみましょう。

最後の2行で、関数をスレッドとしてオブジェクト化し、スタートさせています。

動作は、全く一緒です。

そして、次はマルチスレッドを試してみましょう。

今度は2つのスレッドを同時に動かしてみます。

結果:さあどうでしょうか。

thread_001とthread_002をスタートして、最後に”here is script end”をするスクリプトです。

thread_001が始まった直後にthread_002もスタートしていますので、スクリプト通り、thread_001による時間カウントが5秒のところで”get up now!!”というthread_002の出力が確認できます。

さらに、スクリプトの最後の”here is script end1”はthread_002がスタートされた直後に終了しています。

メインスレッドが最後までいっても、thread_001、thread_002が終わっていなければ、プログラムは終わりません。このように、実は3つのスレッドが同時に走っているわけです。

最後に

関数をメソド化して使ってみましょう。

動作は一緒です。以上です。