MicroPythonを使ってみる(その2:マルチタスク)


MicroPythonでマルチタスク(マルチスレッド)

めでたく第2回目。スレッドを使ったマルチタスクを実現してみる。

用いたもの

その1同様、ESP32 DevKitボード。

マルチタスク手法

今回用いるスレッド(_Thread)以外にも、asyncioなどがあるようだが、どうもうまく動作せず、その他はとりあえずPending。

_Thread

本家サイトのここから情報が見つかる。

試す内容

タスク(スレッド)を2つ起動し、タスク間でメッセージの通信を行うもの。

タスク間通信

キューの利用を考えたが、この記事のスレッド間通信の説明によると、MicroPythonにはQueueモジュールが搭載されていないらしい。なので、単なるリストを利用した。また、リストの排他制御はここでは扱っていない。

ソースコード

こちらのコードをもとに作成。

Thread&List.py
import _thread
import time

q = []  # メッセージを送受信するリスト(Queue)

def SendThread():  # データ送信スレッド
  count = 0
  while True:
    print("Send data")
    q.append(count)  # リストへcount値を入れる
    count += 1
    time.sleep(3)

def RecvThread():  # データ受信スレッド
  while True:
    print("Recv Thread");
    if len(q) > 0:
      data = q.pop()  # リストから値を取り出す
      print('Recv data = {}'.format(data))
    time.sleep(1)

_thread.start_new_thread(SendThread, ())  # SendThreadの起動
_thread.start_new_thread(RecvThread, ())  # RecvThreadの起動
  • SendThread: 3秒毎にcount値を送る&"Send data"表示
  • RecvThread: 1秒毎に"Recv Thread"表示&リストデータがある場合に値を表示

実行結果


成功。