asyncio --- 非同期I/Oスケジューラ¶
このモジュールは、async/await コルーチン向けの協調的マルチタスクスケジューラと、同期用のプリミティブ(ロック、イベント)、ストリームリーダーおよびライターを介したノンブロッキングTCPネットワーキング機能を提供します。タスクは単一のイベントループ上で並行に実行され、現在実行中のタスクは await によって制御をループに戻します。
例:
import asyncio
async def blink(led, period_ms):
while True:
led.on()
await asyncio.sleep_ms(5)
led.off()
await asyncio.sleep_ms(period_ms)
async def main(led1, led2):
asyncio.create_task(blink(led1, 700))
asyncio.create_task(blink(led2, 400))
await asyncio.sleep_ms(10_000)
# Running on an OpenMV Cam
from machine import LED
asyncio.run(main(LED(1), LED(2)))
コア関数¶
- asyncio.create_task(coro: Coroutine) Task¶
指定したコルーチンから新しいタスクを作成し、実行するようにスケジュールします。
対応する
Taskオブジェクトを返します。
- asyncio.run(coro: Coroutine) Any¶
指定したコルーチンから新しいタスクを作成し、完了するまで実行します。
coro が返した値を返します。
追加の関数¶
- asyncio.wait_for(awaitable: Awaitable, timeout: float) Any¶
awaitable が完了するのを待ちますが、timeout 秒より長くかかった場合はキャンセルします。awaitable がタスクでない場合は、それからタスクが作成されます。
タイムアウトが発生すると、タスクをキャンセルして
asyncio.TimeoutErrorを送出します。これは呼び出し側で捕捉する必要があります。タスクはasyncio.CancelledErrorを受け取り、これは無視するか、try...exceptまたはtry...finallyで捕捉してクリーンアップコードを実行できます。awaitable の戻り値を返します。
これはコルーチンです。
- asyncio.wait_for_ms(awaitable: Awaitable, timeout: int) Any¶
wait_for()と同様ですが、timeout はミリ秒単位の整数です。これはコルーチンであり、MicroPythonの拡張機能です。
class Task¶
- class asyncio.Task¶
このオブジェクトはコルーチンを実行中のタスクとしてラップします。タスクは
await taskを使って待機でき、これによりタスクの完了を待ってタスクの戻り値を返します。タスクは直接作成すべきではなく、代わりに
create_task()を使って作成してください。
class Event¶
- class asyncio.Event¶
タスクを同期するために使用できる新しいイベントを作成します。イベントはクリアされた状態で開始します。
- set() None¶
イベントをセットします。そのイベントを待機しているタスクは実行するようにスケジュールされます。
注意: これはタスク内から呼び出す必要があります。IRQ、スケジューラのコールバック、または他のスレッドから呼び出すのは安全ではありません。
ThreadSafeFlagを参照してください。
class ThreadSafeFlag¶
- class asyncio.ThreadSafeFlag¶
他のスレッド、IRQ、スケジューラのコールバックなど、asyncioループの外で実行されているコードとタスクを同期するために使用できる新しいフラグを作成します。フラグはクリアされた状態で開始します。
class Lock¶
- class asyncio.Lock¶
タスクを協調させるために使用できる新しいロックを作成します。ロックはロックされていない状態で開始します。
以下のメソッドに加えて、ロックは
async with文の中で使用できます。
TCPストリーム接続¶
- asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]¶
指定した host と port へのTCP接続を開きます。host アドレスは
socket.getaddrinfo()を使って解決されますが、これは現在ブロッキング呼び出しです。ssl がssl.SSLContextオブジェクトの場合、このコンテキストを使ってトランスポートが作成されます。ssl がTrueの場合は、デフォルトのコンテキストが使用されます。リーダーストリームとライターストリームのペアを返します。ホストが解決できなかった場合や接続が確立できなかった場合は、ソケット固有の
OSErrorを送出します。これはコルーチンです。
- asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server¶
指定した host と port でTCPサーバーを開始します。callback は受信して受け入れられた接続に対して呼び出され、その接続用のリーダーストリームとライターストリームの2つの引数が渡されます。
ssl が
ssl.SSLContextオブジェクトの場合、このコンテキストを使ってトランスポートが作成されます。Serverオブジェクトを返します。これはコルーチンです。
- class asyncio.Stream¶
これはTCPストリーム接続を表します。コードを最小化するため、このクラスはリーダーとライターの両方を実装しており、
StreamReaderとStreamWriterの両方がこのクラスのエイリアスになっています。- read(n: int = -1) bytes¶
最大 n バイトを読み取って返します。n が指定されないか -1 の場合は、EOFまですべてのバイトを読み取ります。バイトが1つも読み取られる前にEOFに達した場合、戻り値は空のbytesオブジェクトになります。
これはコルーチンです。
- readinto(buf: bytearray | memoryview) int¶
最大nバイトを buf に読み込みます。nは buf の長さに等しくなります。
buf に読み込まれたバイト数を返します。
これはコルーチンであり、MicroPythonの拡張機能です。
- readexactly(n: int) bytes¶
正確に n バイトを読み取り、bytesオブジェクトとして返します。
n バイトを読み取る前にストリームが終了した場合、
EOFError例外を送出します。これはコルーチンです。
- write(buf: bytes) None¶
buf を出力バッファに蓄積します。データは
Stream.drain()が呼び出されたときにのみフラッシュされます。この関数を呼び出した直後にStream.drain()を呼び出すことを推奨します。
イベントループ¶
- asyncio.new_event_loop() Loop¶
イベントループをリセットして返します。
注意: MicroPythonにはイベントループが1つしかないため、この関数はループの状態をリセットするだけで、新しいループを作成するわけではありません。
- class asyncio.Loop¶
これはタスクのスケジュールと実行を行うオブジェクトを表します。直接作成することはできず、代わりに
get_event_loop()を使用してください。- run_until_complete(awaitable: Awaitable) Any¶
指定した awaitable が完了するまで実行します。awaitable がタスクでない場合は、タスクに昇格されます。
- set_exception_handler(handler: Callable) None¶
捕捉されなかった例外をTaskが送出したときに呼び出す例外ハンドラを設定します。handler は2つの引数
(loop, context)を受け取る必要があります。