8. Asyncio¶
これまでのチュートリアルのスクリプトはすべて 逐次的 でした。1 度に 1 行が実行され、待機しなければならない呼び出し(センサー読み取り、ネットワークの往復、スナップショット)は、それが完了するまでスクリプトをブロックします。これは、やることが 1 つしかない間はうまく機能します。アプリケーションが複数のことを同時に行う必要が出た瞬間に(スナップショットループを実行し ながら シリアルコマンドに応答し、さらに ネットワーク経由でフレームをアップロードするなど)、逐次的なスクリプトは破綻します。最初の遅い呼び出しが、ほかのすべての処理の進行を止めてしまうのです。
asyncio モジュールは MicroPython の答えです。アプリケーションが複数のジョブを別々の コルーチン として記述し、それらを単一のスレッド上で 協調的に 並行実行できるようにします。現在実行中のコルーチンは、待機しなければならなくなるたびに、制御をスケジューラに譲ります。スナップショットループ、UART リーダー、ネットワーククライアントがすべて同じスクリプト内に共存でき、あるものの遅い部分がほかのものを凍結させることはもうありません。
以降のページでは、async/await キーワードと Task のライフサイクル、gather() と wait_for() による協調、キャンセルと例外の伝播、3 つの組み込み同期プリミティブ(Event、Lock、ThreadSafeFlag)、アプリケーションのクラスを asyncio のイディオムに組み込むための言語フック、snapshot() をコルーチンとして実行できるようにする小さな CSI ラッパー、そして協調スケジューリングに伴うよくある落とし穴を取り上げます。
同期プリミティブ
カスタム非同期オブジェクト
ループ制御
フレームキャプチャ
落とし穴
まとめ