select — I / Oの完了を待っています—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/select
移動先:案内検索

select — I / Oの完了を待機しています


このモジュールは、ほとんどのオペレーティングシステムで使用可能なselect()およびpoll()機能、Solarisおよびその派生物で使用可能なdevpoll()、Linux2.5以降で使用可能なepoll()およびkqueue()はほとんどのBSDで利用できます。 Windowsでは、ソケットに対してのみ機能することに注意してください。 他のオペレーティングシステムでは、他のファイルタイプでも機能します(特に、Unixではパイプで機能します)。 通常のファイルでは、ファイルが最後に読み取られてから大きくなったかどうかを判断するために使用することはできません。

ノート

セレクターモジュールは、 select モジュールプリミティブに基づいて構築された高レベルで効率的なI / O多重化を可能にします。 使用するOSレベルのプリミティブを正確に制御する必要がない限り、代わりにセレクターモジュールを使用することをお勧めします。


モジュールは以下を定義します:

exception select.error

OSError の非推奨のエイリアス。

バージョン3.3で変更: PEP 3151 に続いて、このクラスは OSError のエイリアスになりました。

select.devpoll()

(Solarisおよびその派生物でのみサポートされます。)/dev/pollポーリングオブジェクトを返します。 devpollオブジェクトでサポートされているメソッドについては、以下のセクション / dev / pollポーリングオブジェクトを参照してください。

devpoll()オブジェクトは、インスタンス化時に許可されるファイル記述子の数にリンクされています。 プログラムがこの値を減らすと、devpoll()は失敗します。 プログラムがこの値を増やすと、devpoll()はアクティブなファイル記述子の不完全なリストを返す場合があります。

新しいファイル記述子は継承不可です。

バージョン3.3の新機能。

バージョン3.4で変更:新しいファイル記述子は継承できなくなりました。

select.epoll(sizehint=- 1, flags=0)

(Linux 2.5.44以降でのみサポートされます。)エッジポーリングオブジェクトを返します。これは、I / Oイベントのエッジまたはレベルトリガーインターフェイスとして使用できます。

sizehint は、登録される予定のイベントの数についてepollに通知します。 デフォルトを使用するには、正、または -1 である必要があります。 epoll_create1()が利用できない古いシステムでのみ使用されます。 それ以外の場合は効果がありません(ただし、その値はまだチェックされています)。

flags は非推奨になり、完全に無視されます。 ただし、指定する場合、その値は0またはselect.EPOLL_CLOEXECである必要があります。そうでない場合、OSErrorが発生します。

オブジェクトのエポーリングでサポートされるメソッドについては、以下のエッジおよびレベルトリガーポーリング(epoll)オブジェクトセクションを参照してください。

epollオブジェクトはコンテキスト管理プロトコルをサポートします。 with ステートメントで使用すると、新しいファイル記述子はブロックの最後で自動的に閉じられます。

新しいファイル記述子は継承不可です。

バージョン3.3で変更: flags パラメーターが追加されました。

バージョン3.4で変更: with ステートメントのサポートが追加されました。 新しいファイル記述子は継承できなくなりました。

バージョン3.4以降非推奨: flags パラメーター。 select.EPOLL_CLOEXECがデフォルトで使用されるようになりました。 os.set_inheritable()を使用して、ファイル記述子を継承可能にします。

select.poll()
(すべてのオペレーティングシステムでサポートされているわけではありません。)ファイル記述子の登録と登録解除をサポートし、I / Oイベントをポーリングするポーリングオブジェクトを返します。 オブジェクトのポーリングでサポートされるメソッドについては、以下のセクションオブジェクトのポーリングを参照してください。
select.kqueue()

(BSDでのみサポートされています。)カーネルキューオブジェクトを返します。 kqueueオブジェクトでサポートされるメソッドについては、以下のセクション Kqueueオブジェクトを参照してください。

新しいファイル記述子は継承不可です。

バージョン3.4で変更:新しいファイル記述子は継承できなくなりました。

select.kevent(ident, filter=KQ_FILTER_READ, flags=KQ_EV_ADD, fflags=0, data=0, udata=0)
(BSDでのみサポートされています。)カーネルイベントオブジェクトを返します。 keventオブジェクトでサポートされるメソッドについては、以下のセクション Keventオブジェクトを参照してください。
select.select(rlist, wlist, xlist[, timeout])

これは、Unix select()システムコールへの簡単なインターフェイスです。 最初の3つの引数は、「待機可能なオブジェクト」の反復可能オブジェクトです。ファイル記述子を表す整数、または fileno()という名前のパラメーターなしのメソッドを持つオブジェクトがそのような整数を返します。

  • rlist :読む準備ができるまで待つ

  • wlist :書き込みの準備ができるまで待ちます

  • xlist :「例外的な状態」を待ちます(システムがそのような状態と見なすものについては、マニュアルページを参照してください)

空のイテラブルは許可されますが、3つの空のイテラブルの受け入れはプラットフォームによって異なります。 (Unixで動作することは知られていますが、Windowsでは動作しません。)オプションの timeout 引数は、タイムアウトを秒単位の浮動小数点数として指定します。 timeout 引数を省略すると、少なくとも1つのファイル記述子の準備ができるまで関数がブロックされます。 タイムアウト値がゼロの場合、ポーリングが指定され、ブロックされることはありません。

戻り値は、準備ができているオブジェクトのリストのトリプルです。最初の3つの引数のサブセットです。 ファイル記述子の準備ができていない状態でタイムアウトに達すると、3つの空のリストが返されます。

iterablesで受け入れ可能なオブジェクトタイプには、Python ファイルオブジェクトがあります(例: sys.stdin、または open()または os.popen())によって返されるオブジェクト、 socket.socket()によって返されるソケットオブジェクト。 適切な fileno()メソッド(ランダムな整数だけでなく実際にファイル記述子を返す)があれば、 wrapper クラスを自分で定義することもできます。

ノート

Windows上のファイルオブジェクトは受け入れられませんが、ソケットは受け入れられます。 Windowsでは、基盤となるselect()関数はWinSockライブラリによって提供され、WinSockに由来しないファイル記述子を処理しません。

バージョン3.5で変更:シグナルハンドラーが例外を発生させた場合を除いて、シグナルによって中断されたときに関数が再計算されたタイムアウトで再試行されるようになりました( PEP 475 を参照)理論的根拠のために)、 InterruptedError を発生させる代わりに。

select.PIPE_BUF

select()poll()、またはこのモジュールの別のインターフェイスによってパイプが書き込みの準備ができていると報告されたときに、パイプをブロックせずに書き込むことができる最小バイト数。 これは、ソケットなどの他の種類のファイルのようなオブジェクトには適用されません。

この値は、POSIXによって少なくとも512であることが保証されています。

バージョン3.2の新機能。

/dev/pollポーリングオブジェクト

Solarisおよびその派生物には/dev/pollがあります。 select()はO(最高のファイル記述子)であり、poll()はO(ファイル記述子の数)ですが、/dev/pollはO(アクティブなファイル記述子)です。

/dev/pollの動作は、標準のpoll()オブジェクトに非常に近いものです。

devpoll.close()

ポーリングオブジェクトのファイル記述子を閉じます。

バージョン3.4の新機能。

devpoll.closed

Trueポーリングオブジェクトが閉じている場合。

バージョン3.4の新機能。

devpoll.fileno()

ポーリングオブジェクトのファイル記述子番号を返します。

バージョン3.4の新機能。

devpoll.register(fd[, eventmask])

ファイル記述子をポーリングオブジェクトに登録します。 poll()メソッドを今後呼び出すと、ファイル記述子に保留中のI / Oイベントがあるかどうかがチェックされます。 fd は、整数、または整数を返す fileno()メソッドを持つオブジェクトのいずれかです。 ファイルオブジェクトはfileno()を実装しているため、引数としても使用できます。

eventmask は、チェックするイベントのタイプを説明するオプションのビットマスクです。 定数はpoll()オブジェクトの場合と同じです。 デフォルト値は、定数POLLINPOLLPRI、およびPOLLOUTの組み合わせです。

警告

すでに登録されているファイル記述子の登録はエラーではありませんが、結果は未定義です。 適切なアクションは、最初に登録を解除または変更することです。 これは、poll()と比較した場合の重要な違いです。

devpoll.modify(fd[, eventmask])
このメソッドは、 unregister()の後に register()を実行します。 同じことを明示的に行うよりも(少し)効率的です。
devpoll.unregister(fd)

ポーリングオブジェクトによって追跡されているファイル記述子を削除します。 register()メソッドと同様に、 fd は整数、または整数を返す fileno()メソッドを持つオブジェクトにすることができます。

登録されていないファイル記述子を削除しようとしても、安全に無視されます。

devpoll.poll([timeout])

登録されたファイル記述子のセットをポーリングし、報告するイベントまたはエラーがある記述子の(fd, event) 2タプルを含む空の可能性のあるリストを返します。 fd はファイル記述子であり、 event は、その記述子の報告されたイベントにビットが設定されたビットマスクです— POLLINは入力を待機し、POLLOUT記述子を書き込むことができることを示すなど。 空のリストは、呼び出しがタイムアウトし、報告するイベントがファイル記述子にないことを示します。 timeout が指定されている場合、システムが戻る前にイベントを待機する時間の長さをミリ秒単位で指定します。 timeout が省略されている場合、-1、または None の場合、このポーリングオブジェクトのイベントが発生するまで呼び出しはブロックされます。

バージョン3.5で変更:シグナルハンドラーが例外を発生させた場合を除いて、シグナルによって中断されたときに関数が再計算されたタイムアウトで再試行されるようになりました( PEP 475 を参照)理論的根拠のために)、 InterruptedError を発生させる代わりに。


エッジおよびレベルトリガーポーリング(epoll)オブジェクト

https://linux.die.net/man/4/epoll

イベントマスク

絶え間ない 意味
EPOLLIN 読むことができます
EPOLLOUT 書き込み可能
EPOLLPRI 読み取りのための緊急データ
EPOLLERR アソシエーションでエラー状態が発生しました。 fd
EPOLLHUP アソシエーションでハングアップが発生しました。 fd
EPOLLET エッジトリガー動作を設定します。デフォルトはレベルトリガー動作です。
EPOLLONESHOT ワンショット動作を設定します。 1つのイベントが引き出されると、fdは内部的に無効になります
EPOLLEXCLUSIVE 関連付けられたfdにイベントがある場合、1つのepollオブジェクトのみをウェイクアップします。 デフォルト(このフラグが設定されていない場合)は、fdでポーリングしているすべてのepollオブジェクトをウェイクアップすることです。
EPOLLRDHUP ストリームソケットピアが接続を閉じるか、接続の半分を書き込んでシャットダウンします。
EPOLLRDNORM EPOLLINと同等
EPOLLRDBAND 優先データ帯域を読み取ることができます。
EPOLLWRNORM EPOLLOUTと同等
EPOLLWRBAND 優先データが書き込まれる場合があります。
EPOLLMSG 無視されます。

バージョン3.6の新機能: EPOLLEXCLUSIVEが追加されました。 Linuxカーネル4.5以降でのみサポートされています。


epoll.close()
epollオブジェクトの制御ファイル記述子を閉じます。
epoll.closed
True epollオブジェクトが閉じている場合。
epoll.fileno()
コントロールfdのファイル記述子番号を返します。
epoll.fromfd(fd)
指定されたファイル記述子からepollオブジェクトを作成します。
epoll.register(fd[, eventmask])
fd記述子をepollオブジェクトに登録します。
epoll.modify(fd, eventmask)
登録されたファイル記述子を変更します。
epoll.unregister(fd)
epollオブジェクトから登録済みのファイル記述子を削除します。
epoll.poll(timeout=None, maxevents=- 1)

イベントを待ちます。 秒単位のタイムアウト(フロート)

バージョン3.5で変更:シグナルハンドラーが例外を発生させた場合を除いて、シグナルによって中断されたときに関数が再計算されたタイムアウトで再試行されるようになりました( PEP 475 を参照)理論的根拠のために)、 InterruptedError を発生させる代わりに。


オブジェクトのポーリング

poll()システムコールは、ほとんどのUnixシステムでサポートされており、多数のクライアントに同時にサービスを提供するネットワークサーバーのスケーラビリティを向上させます。 poll()は、システムコールで対象のファイル記述子を一覧表示するだけでよいため、スケーリングが向上します。select()はビットマップを作成し、対象のfdsのビットをオンにします。その後、ビットマップ全体を再度線形スキャン。 select()はO(最大のファイル記述子)であり、poll()はO(ファイル記述子の数)です。

poll.register(fd[, eventmask])

ファイル記述子をポーリングオブジェクトに登録します。 poll()メソッドを今後呼び出すと、ファイル記述子に保留中のI / Oイベントがあるかどうかがチェックされます。 fd は、整数、または整数を返す fileno()メソッドを持つオブジェクトのいずれかです。 ファイルオブジェクトはfileno()を実装しているため、引数としても使用できます。

eventmask は、チェックするイベントのタイプを記述するオプションのビットマスクであり、定数POLLINPOLLPRI、およびPOLLOUTの組み合わせにすることができます。 ]、以下の表で説明されています。 指定しない場合、使用されるデフォルト値は3つのタイプのイベントすべてをチェックします。

絶え間ない

意味

POLLIN

読み取るデータがあります

POLLPRI

読むべき緊急のデータがあります

POLLOUT

出力の準備ができました:書き込みはブロックされません

POLLERR

ある種のエラー状態

POLLHUP

電話を切る

POLLRDHUP

ストリームソケットピアが接続を閉じたか、接続の半分の書き込みをシャットダウンしました

POLLNVAL

無効なリクエスト:記述子が開かれていません

すでに登録されているファイル記述子を登録することはエラーではなく、記述子を1回だけ登録するのと同じ効果があります。

poll.modify(fd, eventmask)
すでに登録されているfdを変更します。 これはregister(fd, eventmask)と同じ効果があります。 登録されていないファイル記述子を変更しようとすると、エラー番号ENOENTOSError 例外が発生します。
poll.unregister(fd)

ポーリングオブジェクトによって追跡されているファイル記述子を削除します。 register()メソッドと同様に、 fd は整数、または整数を返す fileno()メソッドを持つオブジェクトにすることができます。

登録されていないファイル記述子を削除しようとすると、 KeyError 例外が発生します。

poll.poll([timeout])

登録されたファイル記述子のセットをポーリングし、報告するイベントまたはエラーがある記述子の(fd, event) 2タプルを含む空の可能性のあるリストを返します。 fd はファイル記述子であり、 event は、その記述子の報告されたイベントにビットが設定されたビットマスクです— POLLINは入力を待機し、POLLOUT記述子を書き込むことができることを示すなど。 空のリストは、呼び出しがタイムアウトし、報告するイベントがファイル記述子にないことを示します。 timeout が指定されている場合、システムが戻る前にイベントを待機する時間の長さをミリ秒単位で指定します。 timeout が省略、負、または None の場合、このポーリングオブジェクトのイベントが発生するまで呼び出しはブロックされます。

バージョン3.5で変更:シグナルハンドラーが例外を発生させた場合を除いて、シグナルによって中断されたときに関数が再計算されたタイムアウトで再試行されるようになりました( PEP 475 を参照)理論的根拠のために)、 InterruptedError を発生させる代わりに。


Kqueueオブジェクト

kqueue.close()
kqueueオブジェクトの制御ファイル記述子を閉じます。
kqueue.closed
True kqueueオブジェクトが閉じている場合。
kqueue.fileno()
コントロールfdのファイル記述子番号を返します。
kqueue.fromfd(fd)
指定されたファイル記述子からkqueueオブジェクトを作成します。
kqueue.control(changelist, max_events[, timeout]) eventlist

keventへの低レベルのインターフェース

  • チェンジリストは、keventオブジェクトまたはNoneの反復可能である必要があります

  • max_eventsは0または正の整数でなければなりません

  • 秒単位のタイムアウト(フロート可能)。 デフォルトはNoneで、永久に待機します

バージョン3.5で変更:シグナルハンドラーが例外を発生させた場合を除いて、シグナルによって中断されたときに関数が再計算されたタイムアウトで再試行されるようになりました( PEP 475 を参照)理論的根拠のために)、 InterruptedError を発生させる代わりに。


Keventオブジェクト

https://www.freebsd.org/cgi/man.cgi?query=kqueue&sektion=2

kevent.ident
イベントを識別するために使用される値。 解釈はフィルターによって異なりますが、通常はファイル記述子です。 コンストラクターでは、identはintまたは fileno()メソッドを持つオブジェクトのいずれかです。 keventは整数を内部に格納します。
kevent.filter

カーネルフィルターの名前。

絶え間ない

意味

KQ_FILTER_READ

記述子を受け取り、読み取ることができるデータがある場合は常に返します

KQ_FILTER_WRITE

記述子を受け取り、書き込み可能なデータがある場合は常に返します

KQ_FILTER_AIO

AIOリクエスト

KQ_FILTER_VNODE

fflag で監視されている1つ以上の要求されたイベントが発生したときに返されます

KQ_FILTER_PROC

プロセスIDのイベントを監視する

KQ_FILTER_NETDEV

ネットワークデバイスでイベントを監視する[MacOSXでは使用できません]

KQ_FILTER_SIGNAL

監視されたシグナルがプロセスに配信されるたびに戻ります

KQ_FILTER_TIMER

任意のタイマーを確立します

kevent.flags

フィルターアクション。

絶え間ない

意味

KQ_EV_ADD

イベントを追加または変更します

KQ_EV_DELETE

キューからイベントを削除します

KQ_EV_ENABLE

イベントを返すためのPermitscontrol()

KQ_EV_DISABLE

イベントを無効にします

KQ_EV_ONESHOT

最初の発生後にイベントを削除します

KQ_EV_CLEAR

イベントが取得された後、状態をリセットします

KQ_EV_SYSFLAGS

内部イベント

KQ_EV_FLAG1

内部イベント

KQ_EV_EOF

特定のEOF条件をフィルタリングする

KQ_EV_ERROR

戻り値を参照してください

kevent.fflags

特定のフラグをフィルタリングします。

KQ_FILTER_READおよびKQ_FILTER_WRITEフィルターフラグ:

絶え間ない

意味

KQ_NOTE_LOWAT

ソケットバッファの最低水準点

KQ_FILTER_VNODEフィルターフラグ:

絶え間ない

意味

KQ_NOTE_DELETE

unlink()が呼び出されました

KQ_NOTE_WRITE

書き込みが発生しました

KQ_NOTE_EXTEND

ファイルが拡張されました

KQ_NOTE_ATTRIB

属性が変更されました

KQ_NOTE_LINK

リンク数が変更されました

KQ_NOTE_RENAME

ファイルの名前が変更されました

KQ_NOTE_REVOKE

ファイルへのアクセスが取り消されました

KQ_FILTER_PROCフィルターフラグ:

絶え間ない

意味

KQ_NOTE_EXIT

プロセスが終了しました

KQ_NOTE_FORK

プロセスは fork()を呼び出しました

KQ_NOTE_EXEC

プロセスが新しいプロセスを実行しました

KQ_NOTE_PCTRLMASK

内部フィルターフラグ

KQ_NOTE_PDATAMASK

内部フィルターフラグ

KQ_NOTE_TRACK

fork()全体のプロセスに従います

KQ_NOTE_CHILD

NOTE_TRACK の子プロセスで返されます

KQ_NOTE_TRACKERR

子供に付けられない

KQ_FILTER_NETDEVフィルターフラグ(Mac OS Xでは使用できません):

絶え間ない

意味

KQ_NOTE_LINKUP

リンクがアップしています

KQ_NOTE_LINKDOWN

リンクがダウンしています

KQ_NOTE_LINKINV

リンク状態が無効です

kevent.data
特定のデータをフィルタリングします。
kevent.udata
ユーザー定義の値。