今回はPythonでマルチスレッドの処理を実装する方法を解説します。 マイコンなどのCPUを使ったアプリケーションでは、処理の優先度に応じで複数のスレッドを切り替えてCPUリソースを有効に活用することが重要となります。
特に組込みアプリケーションでは必須の知識となりますので、ぜひ挑戦してみてください。
Raspberry Pi(ラズベリーパイ)とは
Raspberry Pi 5は、Raspberry Pi財団が開発した最新のシングルボードコンピュータで、従来モデルよりも大幅な性能向上を実現しています。
搭載される64ビットクアッドコアプロセッサは、クロック速度が最大2.4GHzに達し、前世代よりも処理速度が格段に向上しました。また、4GBまたは8GBのRAMを選択できるため、教育用途からリソースを必要とするプロジェクトまで幅広く対応可能です。
グラフィックス性能も強化され、4K解像度でのデュアルディスプレイ出力をサポートしています。さらに、新たにPCIeインターフェイスが追加され、外部ストレージや高速デバイスとの接続が容易になりました。Wi-Fi 6やBluetooth 5.2の導入により、無線通信も高速かつ安定。
教育、IoT、AI開発、メディア再生など、多様な用途に対応するRaspberry Pi 5は、初心者から上級者まで幅広いユーザーにとって魅力的な選択肢となっています。
Raspberry Piでできることについては以下の記事で解説していますので、あわせてご覧ください。
マルチスレッドとは
マルチスレッドとは、一つのプログラム内で複数のタスクを同時に実行する技術のことを指します。これは、一つのプロセス内で複数のスレッドを生成し、それぞれが独立したタスクを実行することで実現されます。
マルチスレッドのメリット
マルチスレッドでプログラムを実装することは、以下のようなメリットがあります。
- 効率性: マルチスレッドを使用すると、一つのプログラム内で複数のタスクを同時に実行できるため、全体の処理時間を短縮することができます。これは、特にI/O操作が多いプログラムや、複数のタスクが互いに依存していない場合に有効です。
- レスポンス性: GUIアプリケーションなどでは、一つのスレッドがユーザーインターフェースを制御し、他のスレッドがバックグラウンドで処理を行うことで、ユーザー体験を向上させることができます。
- リソースの有効活用: マルチコアまたはマルチプロセッサのシステムでは、マルチスレッドを使用することで、複数のコアまたはプロセッサを同時に活用し、全体のパフォーマンスを向上させることができます。
作成したPythonコード
このプログラムは、Raspberry Pi上のPythonで動作するマルチスレッドの例です。プログラムは3つのスレッドを作成し、それぞれ異なる優先度で実行します。各スレッドはコマンドラインに文字列を出力します。
コード解説
- インポート: プログラムは
threading
,os
, およびtime
モジュールをインポートします。これらは、スレッドの作成、プロセスの優先度の変更、および遅延の追加に使用されます。 - スレッド関数の定義: 3つの関数
low_priority_thread
,medium_priority_thread
, およびhigh_priority_thread
が定義されています。これらの関数はそれぞれ、低、中、および高の優先度で実行されるスレッドのタスクを表します。low_priority_thread
: この関数は、優先度を最低に設定し(os.nice(19)
)、2秒間遅延した後に、”Low priority thread is running”というメッセージを出力します。medium_priority_thread
: この関数は、優先度を中程度に設定し(os.nice(10)
)、1秒間遅延した後に、”Medium priority thread is running”というメッセージを出力します。high_priority_thread
: この関数は、優先度を最高に設定し(os.nice(-20)
)、”High priority thread is running”というメッセージを直ちに出力します。
- スレッドの作成:
threading.Thread
クラスを使用して3つのスレッドオブジェクト(low_priority
,medium_priority
,high_priority
)を作成します。各スレッドのtarget
パラメータは、上記で定義した関数に設定されます。 - スレッドの開始:
start()
メソッドを使用して、低優先度のスレッドから順にスレッドを開始します。 - スレッドの終了を待つ:
join()
メソッドを使用して、すべてのスレッドが終了するのを待ちます。これにより、プログラムはすべてのスレッドが完了するまで終了しません。 - 完了メッセージ: 最後に、”All threads are done”というメッセージが出力され、プログラムが終了します。
全体のPythonコード
今回作成した全体のソースコードは以下の通りです。
import _thread
import utime
# スレッド1: 高優先度タスク
def task1():
while True:
print("Task 1: High priority")
utime.sleep(0.1) # 100ミリ秒間スリープ
# スレッド2: 中優先度タスク
def task2():
while True:
print("Task 2: Medium priority")
utime.sleep(0.3) # 300ミリ秒間スリープ
# スレッド3: 低優先度タスク
def task3():
while True:
print("Task 3: Low priority")
utime.sleep(0.5) # 500ミリ秒間スリープ
# スレッドを開始
_thread.start_new_thread(task1, ())
_thread.start_new_thread(task2, ())
_thread.start_new_thread(task3, ())
注意点として、os.nice()
関数はプロセス全体の優先度を変更するため、root権限でプログラムを実行する必要があります。これはsudo python multithread.py
コマンドを使用して行います。
実行結果
このプログラムでは、低優先度のスレッドが最初に開始され、2秒間遅延します。次に、中優先度のスレッドが開始され、1秒間遅延します。最後に、高優先度のスレッドが開始されます。
実行すると以下のように高優先スレッドから順に処理が完了していることが確認できました。
\ Pythonを自宅で好きな時に学べる! /
まとめ
今回はPythonでマルチスレッドを実装する方法について解説しました。
マルチスレッドはWebアプリケーションから組み込み、GUIまで広く使われているテクニックですので、ぜひ活用してみてください。
また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。
スキルアップや副業にぜひ活用してみてください。
スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。
講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。
それでは、また次の記事でお会いしましょう。
コメント