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.current_task() Task

現在実行中のタスクに関連付けられた Task オブジェクトを返します。

asyncio.run(coro: Coroutine) Any

指定したコルーチンから新しいタスクを作成し、完了するまで実行します。

coro が返した値を返します。

asyncio.sleep(t: float) None

t 秒間(浮動小数点数も可)スリープします。

これはコルーチンです。

asyncio.sleep_ms(t: int) None

t ミリ秒間スリープします。

これはコルーチンであり、MicroPythonの拡張機能です。

追加の関数

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の拡張機能です。

asyncio.gather(*awaitables, return_exceptions: bool = False) List

すべての awaitables を並行に実行します。タスクでない awaitables はタスクに昇格されます。

すべての awaitables の戻り値のリストを返します。

これはコルーチンです。

class Task

class asyncio.Task

このオブジェクトはコルーチンを実行中のタスクとしてラップします。タスクは await task を使って待機でき、これによりタスクの完了を待ってタスクの戻り値を返します。

タスクは直接作成すべきではなく、代わりに create_task() を使って作成してください。

cancel() None

asyncio.CancelledError をタスクに注入することでタスクをキャンセルします。タスクはこの例外を無視する場合があります。これを捕捉するか、try ... finally を使ってクリーンアップコードを実行できます。

class Event

class asyncio.Event

タスクを同期するために使用できる新しいイベントを作成します。イベントはクリアされた状態で開始します。

is_set() bool

イベントがセットされている場合は True を、そうでない場合は False を返します。

set() None

イベントをセットします。そのイベントを待機しているタスクは実行するようにスケジュールされます。

注意: これはタスク内から呼び出す必要があります。IRQ、スケジューラのコールバック、または他のスレッドから呼び出すのは安全ではありません。ThreadSafeFlag を参照してください。

clear() None

イベントをクリアします。

wait() None

イベントがセットされるのを待ちます。イベントがすでにセットされている場合はただちに返ります。

これはコルーチンです。

class ThreadSafeFlag

class asyncio.ThreadSafeFlag

他のスレッド、IRQ、スケジューラのコールバックなど、asyncioループの外で実行されているコードとタスクを同期するために使用できる新しいフラグを作成します。フラグはクリアされた状態で開始します。

set() None

フラグをセットします。フラグを待機しているタスクがある場合、そのタスクは実行するようにスケジュールされます。

clear() None

フラグをクリアします。これは、待機する前に、以前にセットされた可能性のあるフラグがクリアされていることを確実にするために使用できます。

wait() None

フラグがセットされるのを待ちます。フラグがすでにセットされている場合はただちに返ります。フラグは wait から返るときに自動的にリセットされます。

1つのフラグは一度に1つのタスクのみが待機できます。

これはコルーチンです。

class Lock

class asyncio.Lock

タスクを協調させるために使用できる新しいロックを作成します。ロックはロックされていない状態で開始します。

以下のメソッドに加えて、ロックは async with 文の中で使用できます。

locked() bool

ロックがロックされている場合は True を、そうでない場合は False を返します。

acquire() bool

ロックがロックされていない状態になるのを待ち、その後アトミックな方法でロックします。一度にロックを取得できるタスクは1つだけです。

これはコルーチンです。

release() None

ロックを解放します。ロックを待機しているタスクがある場合、キュー内の次のタスクが実行するようにスケジュールされ、ロックはロックされたままになります。それ以外の場合は、待機しているタスクがなく、ロックはロックされていない状態になります。

TCPストリーム接続

asyncio.open_connection(host: str, port: int, ssl: ssl.SSLContext | bool | None = None) Tuple[Stream, Stream]

指定した hostport へのTCP接続を開きます。host アドレスは socket.getaddrinfo() を使って解決されますが、これは現在ブロッキング呼び出しです。sslssl.SSLContext オブジェクトの場合、このコンテキストを使ってトランスポートが作成されます。sslTrue の場合は、デフォルトのコンテキストが使用されます。

リーダーストリームとライターストリームのペアを返します。ホストが解決できなかった場合や接続が確立できなかった場合は、ソケット固有の OSError を送出します。

これはコルーチンです。

asyncio.start_server(callback: Callable, host: str, port: int, backlog: int = 5, ssl: ssl.SSLContext | None = None) Server

指定した hostport でTCPサーバーを開始します。callback は受信して受け入れられた接続に対して呼び出され、その接続用のリーダーストリームとライターストリームの2つの引数が渡されます。

sslssl.SSLContext オブジェクトの場合、このコンテキストを使ってトランスポートが作成されます。

Server オブジェクトを返します。

これはコルーチンです。

class asyncio.Stream

これはTCPストリーム接続を表します。コードを最小化するため、このクラスはリーダーとライターの両方を実装しており、StreamReaderStreamWriter の両方がこのクラスのエイリアスになっています。

get_extra_info(v: str) Any

v で指定された、ストリームに関する追加情報を取得します。v の有効な値は peername です。

close() None

ストリームを閉じます。

wait_closed() None

ストリームが閉じるのを待ちます。

これはコルーチンです。

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 例外を送出します。

これはコルーチンです。

readline() bytes

1行を読み取って返します。

これはコルーチンです。

write(buf: bytes) None

buf を出力バッファに蓄積します。データは Stream.drain() が呼び出されたときにのみフラッシュされます。この関数を呼び出した直後に Stream.drain() を呼び出すことを推奨します。

drain() None

バッファされたすべての出力データをストリームにドレイン(書き出し)します。

これはコルーチンです。

class asyncio.Server

これは start_server() から返されるサーバークラスを表します。async with 文の中で使用すると、終了時にサーバーを閉じることができます。

close() None

サーバーを閉じます。

wait_closed() None

サーバーが閉じるのを待ちます。

これはコルーチンです。

イベントループ

asyncio.get_event_loop() Loop

タスクのスケジュールと実行に使用されるイベントループを返します。Loop を参照してください。

asyncio.new_event_loop() Loop

イベントループをリセットして返します。

注意: MicroPythonにはイベントループが1つしかないため、この関数はループの状態をリセットするだけで、新しいループを作成するわけではありません。

class asyncio.Loop

これはタスクのスケジュールと実行を行うオブジェクトを表します。直接作成することはできず、代わりに get_event_loop() を使用してください。

create_task(coro: Coroutine) Task

指定した coro からタスクを作成し、新しい Task オブジェクトを返します。

run_forever() None

stop() が呼び出されるまでイベントループを実行します。

run_until_complete(awaitable: Awaitable) Any

指定した awaitable が完了するまで実行します。awaitable がタスクでない場合は、タスクに昇格されます。

stop() None

イベントループを停止します。

close() None

イベントループを閉じます。

set_exception_handler(handler: Callable) None

捕捉されなかった例外をTaskが送出したときに呼び出す例外ハンドラを設定します。handler は2つの引数 (loop, context) を受け取る必要があります。

get_exception_handler() Callable | None

現在の例外ハンドラを取得します。ハンドラを返しますが、カスタムハンドラが設定されていない場合は None を返します。

default_exception_handler(context: dict) None

呼び出されるデフォルトの例外ハンドラです。

call_exception_handler(context: dict) None

現在の例外ハンドラを呼び出します。引数 context はそのまま渡され、キー 'message''exception''future' を含む辞書です。