Raspberry PiでPythonを使ってマルチスレッドの処理を実装する方法

  • URLをコピーしました!

※本ページはアフィリエイト広告を利用しています

今回はPythonでマルチスレッドの処理を実装する方法を解説します。 マイコンなどのCPUを使ったアプリケーションでは、処理の優先度に応じで複数のスレッドを切り替えてCPUリソースを有効に活用することが重要となります。

特に組込みアプリケーションでは必須の知識となりますので、ぜひ挑戦してみてください。

目次

Raspberry Pi(ラズベリーパイ)とは

Raspberry Pi(ラズベリーパイ)はイギリスのラズベリーパイ財団が教育用に開発したボードコンピュータです。

最新のRaspberry Pi 4では、ARMアーキテクチャを採用したBroadcom製の高性能SoC BCM2711を搭載しており、1.5GHzで動作するARM Cortex-A72が4コアとマイコンボードの中では非常に高速な処理能力を持っています。また、ユーザーがアクセス可能な40ピンのGPIOも搭載しており、外部ハードウェアを制御することが可能です。

詳細なスペック等は以下の記事で解説していますので、あわせてご覧ください。

マルチスレッドとは

マルチスレッドとは、一つのプログラム内で複数のタスクを同時に実行する技術のことを指します。これは、一つのプロセス内で複数のスレッドを生成し、それぞれが独立したタスクを実行することで実現されます。

マルチスレッドのメリット

マルチスレッドでプログラムを実装することは、以下のようなメリットがあります。

マルチスレッドのメリット
  1. 効率性: マルチスレッドを使用すると、一つのプログラム内で複数のタスクを同時に実行できるため、全体の処理時間を短縮することができます。これは、特にI/O操作が多いプログラムや、複数のタスクが互いに依存していない場合に有効です。
  2. レスポンス性: GUIアプリケーションなどでは、一つのスレッドがユーザーインターフェースを制御し、他のスレッドがバックグラウンドで処理を行うことで、ユーザー体験を向上させることができます。
  3. リソースの有効活用: マルチコアまたはマルチプロセッサのシステムでは、マルチスレッドを使用することで、複数のコアまたはプロセッサを同時に活用し、全体のパフォーマンスを向上させることができます。

作成したPythonコード

このプログラムは、Raspberry Pi上のPythonで動作するマルチスレッドの例です。プログラムは3つのスレッドを作成し、それぞれ異なる優先度で実行します。各スレッドはコマンドラインに文字列を出力します。

コード解説

  1. インポート: プログラムはthreading, os, およびtimeモジュールをインポートします。これらは、スレッドの作成、プロセスの優先度の変更、および遅延の追加に使用されます。
  2. スレッド関数の定義: 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”というメッセージを直ちに出力します。
  3. スレッドの作成: threading.Threadクラスを使用して3つのスレッドオブジェクト(low_priority, medium_priority, high_priority)を作成します。各スレッドのtargetパラメータは、上記で定義した関数に設定されます。
  4. スレッドの開始: start()メソッドを使用して、低優先度のスレッドから順にスレッドを開始します。
  5. スレッドの終了を待つ: join()メソッドを使用して、すべてのスレッドが終了するのを待ちます。これにより、プログラムはすべてのスレッドが完了するまで終了しません。
  6. 完了メッセージ: 最後に、”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円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。

それでは、また次の記事でお会いしましょう。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次