select --- ストリームのセットでイベントを待つ

このモジュールは、単一のオブジェクトでビジーウェイトやブロッキングを行う代わりに、1 つ以上の ストリーム(ソケット、UART、その他の I/O オブジェクトなど、ストリームプロトコルを実装したファイルライクなオブジェクト)が読み書き可能になるまで効率的に待つための関数を提供します。

poll オブジェクトが推奨されるインターフェースです。これは多数のストリームに対応でき、poll.ipoll() 経由で使用すればメモリ割り当てが発生しません。モジュールレベルの select() 関数は、効率の劣る互換性用インターフェースです。

poll オブジェクトを使用する例:

import select

poller = select.poll()
poller.register(uart, select.POLLIN)

while True:
    # Wait up to 1000 ms for the UART to have data.
    for obj, event in poller.poll(1000):
        if event & select.POLLIN:
            print(obj.read())

モジュールレベルの select() 関数を使用する例:

import select

# Wait up to 1 second for the socket to become readable.
rlist, wlist, xlist = select.select([sock], [], [], 1.0)
if rlist:
    data = sock.recv(100)

関数

select.select(rlist: List, wlist: List, xlist: List, timeout: float | None = None) Tuple[List, List, List]

指定されたストリームオブジェクトの 1 つ以上が準備完了になるか、timeout が経過するまで待ちます。

  • rlist は、読み取り可能かどうかを監視するオブジェクトのリストです。

  • wlist は、書き込み可能かどうかを監視するオブジェクトのリストです。

  • xlist は、エラーまたはハングアップ状態を監視するオブジェクトのリストです。

  • timeout は待機する最大時間で、秒単位です(浮動小数点数も受け付けます)。省略された場合や None の場合、呼び出しは無期限にブロックします。0 の場合は即座に戻ります(非ブロッキングなポーリング)。

リストの 3 要素タプル (rlist, wlist, xlist) を返します。返される各リストは、それぞれ読み取り可能になった、書き込み可能になった、またはエラー/ハングアップを通知したオブジェクトを含む、対応する入力リストの部分集合です。何も準備完了にならないまま timeout が経過した場合、3 つのリストはすべて空になります。

この関数は poll より効率が劣ります(呼び出しのたびに内部のポーリングセットを再構築します)。可能であれば代わりに poll を使用してください。

定数

select.POLLIN: int

ストリームから読み取り可能なデータがあります。

select.POLLOUT: int

ストリームは書き込むデータをさらに受け入れることができます。

select.POLLERR: int

ストリームでエラー状態が発生しました。これは 要求していない イベントです。eventmask で要求されていなくても poll.poll() / poll.ipoll() によって報告され、入力 eventmask として渡すことはできません。

select.POLLHUP: int

ストリームがハングアップ/切断されました。これは 要求していない イベントです。eventmask で要求されていなくても poll.poll() / poll.ipoll() によって報告され、入力 eventmask として渡すことはできません。

クラス

class select.poll

登録されたストリーム(またはストリームプロトコルを公開する任意のオブジェクト)のセットを管理し、それらの 1 つ以上が読み取り可能、書き込み可能、または例外的な状態を通知するまで効率的に待つポーリングオブジェクトを作成します。

ストリームは register() で追加し、unregister() で削除します。監視するイベントのセットは modify() で変更できます。設定が完了したら、poll() を呼び出して何かが準備完了になる(またはタイムアウトが経過する)までブロックするか、メモリ割り当てのないイテレータベースのバリアントには ipoll() を呼び出します。

register(obj: Any, eventmask: int = select.POLLIN | select.POLLOUT) None

ポーリング対象として ストリーム obj を登録し、eventmask(以下の論理和)で指定されたイベントを監視します。

  • select.POLLIN -- 読み取り可能なデータがある

  • select.POLLOUT -- ストリームが書き込むデータをさらに受け入れられる

eventmask のデフォルトは select.POLLIN | select.POLLOUT です。

select.POLLHUPselect.POLLERR は入力 eventmask では 無効 です。これらは要求の有無にかかわらず poll() / ipoll() によって報告される、要求していないイベントです(これは POSIX のセマンティクスに一致します)。

同じ obj に対してこのメソッドを複数回呼び出しても問題ありません。後続の呼び出しは obj のイベントマスクを更新し、modify() のように動作します。

unregister(obj: Any) None

登録されたストリームのセットから obj を削除します。現在登録されていない obj の登録解除はエラーになりません(その場合、呼び出しは何の効果も持ちません)。

modify(obj: Any, eventmask: int) None

すでに登録されている obj のイベントマスクを eventmask に変更します。obj が登録されていない場合、errno.ENOENT を伴う OSError を送出します。

poll(timeout: int = -1, /) List[Tuple]

登録されたストリームの少なくとも 1 つが準備完了になるか、例外的な状態を通知するまでブロックし、発火したストリームのリストを返します。

timeout は待機する最大時間で、単位は ミリ秒 です。省略された場合や -1 の場合、呼び出しは無期限にブロックします。0 の場合は即座に戻ります(非ブロッキングなポーリング)。

発火したストリームごとに 1 つの (obj, event, ...) タプルのリストを返します。obj は登録されたストリームで、event は発生した select.POLLIN / select.POLLOUT / select.POLLERR / select.POLLHUP フラグのビット単位の論理和です。各タプルには実装定義の追加要素が含まれる場合があるため、長さがちょうど 2 であると仮定しないでください。何も準備完了にならないまま timeout が経過した場合は、空のリストが返されます。

select.POLLHUPselect.POLLERR は(要求されていなくても)いつでも返される可能性があり、対処しなければなりません。通常は該当するストリームの登録を解除して閉じます。さもなければ、後続の呼び出しはそのストリームに対してこれらのフラグがセットされた状態で即座に返り続けます。

保留中のスケジュール済みコールバックは、ポーリングループに入る前に実行されることが保証されています。

CPython との違い

上記のとおり、返されるタプルには 2 つを超える要素が含まれる場合があります。

ipoll(timeout: int = -1, flags: int = 0, /) Iterator[Tuple]

poll() と同様ですが、リストを作成する代わりに、一度に 1 つの (obj, event, ...) タプルを生成するイテレータを返します。これにより呼び出しごとのメモリ割り当てが回避されます。これは非同期 I/O スケジューラにとって重要です。

生成されるタプルは 呼び出される側が所有します。次の反復で再利用(上書き)されるため、その内容はループ本体内で消費する必要があり、それへの参照を保存してはなりません。

timeout の意味は poll() の場合と同じです。flags1 の場合、ワンショット動作が使用されます。イベントが発火したストリームはイベントマスクが自動的にクリアされ(poll.modify(obj, 0) と同等)、modify() でマスクが再びセットされるまでそのストリームについてそれ以上イベントは報告されません。

保留中のスケジュール済みコールバックは、ポーリングループに入る前に実行されることが保証されています。

CPython との違い

このメソッドは MicroPython の拡張機能です。