micropython
M5stack

M5Stack MicroPython API調査記録 スレッド編

※ 2018年1月8日現在

M5Stack版MicroPythonの _thread モジュールは本家ESP32版から大きく書き換えられています。MicroPythonの下で動いているFreeRTOSのマルチタスク機能をより活かすように実装されています。そのため、APIにも大きな違いがあり、共通しているのは _thread.start_new_thread()_thread.stack_size() ぐらいです。

モジュール _thread

Python 関数はスレッド上で動かすことができる。これはメインのMicroPythonスレッドとは独立したESP32タスクとして関数が実行されることを意味している。

またスレッド間では通知やメッセージの送受信が行える。

関数

_thread.start_new_thread(th_name, th_func, args[, kwargs])

新しいスレッドを開始し、スレッドIDを返す。

th_name - スレッド名

th_func - スレッドで動かす関数

args - 関数の位置引数のタプル

kwargs - 関数のキーワード引数の辞書

_thread.stack_size([size])

新規にスレッドを作成する際のスレッドのスタックサイズをバイト数で返す。オプションの *size+ は以降で作成するスレッドのスタックサイズを指定する。

スレッドで使っている最大スタックサイズは _thread.list() でチェックできる。

_thread.allowsuspend(allow)

allowTrue にすると、スレッドを休止状態にできるようになる。この関数で設定しない限り、スレッドを休止状態にすることは許されない。この関数は該当のスレッド関数内から呼ばなければならない。

_thread.suspend(th_id)

スレッド関数の実行を休止状態にする。

_thread.resume(th_id)

_thread.suspend() で休止状態にしたスレッド関数を実行可能状態にする。

_thread.kill(th_id)

スレッドを停止し、スレッドが確保されていたメモリを開放する。

_thread.getThreadName(th_id)

th_id に該当するスレッドの名前を返す。

_thread.getSelfName()

スレッドで実行中の関数の名前を返す。

_thread.getReplID()

メイン(REPL)スレッドのスレッドUDを返す。メインスレッドに通知/メッセージを送るのに使える。

_thread.getnotification()

スレッドで実行中の関数に通知が送られてきているかチェックする。溜まっている通知があれば 1 以上の整数、無ければ 0 を返す。

_thread.getmsg()

スレッドで実行中の関数にメッセージが送られてきているかチェックする。溜まっているメッセージがあれば3要素、メッセージタイプ、送り元のスレッドID、メッセージ(整数か文字列)自体を持つタプルを返す。

_thread.notify(th_id, value)

IDが th_id であるスレッドに通知を送る。値 value は 1 以上の整数。

_thread.sendmsg(th_id, msg)

IDが th_id であるスレッドにメッセージを送る。値 mag は整数または文字列。

_thread.replAcceptMsg([flag])

メインスレッド(REPL)がメッセージを受け入れられる場合は True を返す。

メインスレッドから呼び出す場合、オプションの flag (True|False) はメインスレッドでメッセージの受付を許可/禁止するかを指定する。

_thread.list([print])

作成済のスレッドすべての状態を表示する。

オプションの printFalse であれば、スレッドの情報をタプルで返す。スレッド情報のタプルは要素として、スレッドID、タイプ、名前、休止状態か、スタックサイズ、最大スタックサイズを持つ。