18.3。 選択する — I / Oの完了を待っています
このモジュールは、ほとんどのオペレーティングシステムで使用可能なselect()
およびpoll()
機能、Solarisおよびその派生物で使用可能なdevpoll()
、Linux2.5以降で使用可能なepoll()
およびkqueue()
はほとんどのBSDで利用できます。 Windowsでは、ソケットに対してのみ機能することに注意してください。 他のオペレーティングシステムでは、他のファイルタイプでも機能します(特に、Unixではパイプで機能します)。 通常のファイルで使用して、ファイルが最後に読み取られてから大きくなったかどうかを判断することはできません。
ノート
セレクターモジュールは、 select モジュールプリミティブに基づいて構築された高レベルで効率的なI / O多重化を可能にします。 使用するOSレベルのプリミティブを正確に制御する必要がない限り、代わりにセレクターモジュールを使用することをお勧めします。
モジュールは以下を定義します:
- exception select.error
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つの空のリストが返されます。
シーケンスで受け入れ可能なオブジェクトタイプには、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であることが保証されています。 可用性:Unix。
バージョン3.2の新機能。
18.3.1。 /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()
オブジェクトの場合と同じです。 デフォルト値は、定数POLLIN
、POLLPRI
、および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 を発生させる代わりに。
18.3.2。 エッジおよびレベルトリガーポーリング(epoll)オブジェクト
http://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
無視されます。
- 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=- 1, maxevents=- 1)
イベントを待ちます。 秒単位のタイムアウト(フロート)
バージョン3.5で変更:シグナルハンドラーが例外を発生させた場合を除いて、シグナルによって中断されたときに関数が再計算されたタイムアウトで再試行されるようになりました( PEP 475 を参照)理論的根拠のために)、 InterruptedError を発生させる代わりに。
18.3.3。 オブジェクトのポーリング
poll()
システムコールは、ほとんどのUnixシステムでサポートされており、多数のクライアントに同時にサービスを提供するネットワークサーバーのスケーラビリティを向上させます。 poll()
は、システムコールで対象のファイル記述子を一覧表示するだけでよいため、スケーリングが向上します。select()
はビットマップを作成し、対象のfdsのビットをオンにします。その後、ビットマップ全体を再度線形スキャン。 select()
はO(最大のファイル記述子)であり、poll()
はO(ファイル記述子の数)です。
- poll.register(fd[, eventmask])
ファイル記述子をポーリングオブジェクトに登録します。 poll()メソッドを今後呼び出すと、ファイル記述子に保留中のI / Oイベントがあるかどうかがチェックされます。 fd は、整数、または整数を返す fileno()メソッドを持つオブジェクトのいずれかです。 ファイルオブジェクトは
fileno()
を実装しているため、引数としても使用できます。eventmask は、チェックするイベントのタイプを記述するオプションのビットマスクであり、定数
POLLIN
、POLLPRI
、およびPOLLOUT
の組み合わせにすることができます。 ]、以下の表で説明されています。 指定しない場合、使用されるデフォルト値は3つのタイプのイベントすべてをチェックします。絶え間ない
意味
POLLIN
読み取るデータがあります
POLLPRI
読むべき緊急のデータがあります
POLLOUT
出力の準備ができました:書き込みはブロックされません
POLLERR
ある種のエラー状態
POLLHUP
電話を切る
POLLRDHUP
ストリームソケットピアが接続を閉じたか、接続の半分の書き込みをシャットダウンしました
POLLNVAL
無効なリクエスト:記述子が開かれていません
すでに登録されているファイル記述子を登録することはエラーではなく、記述子を1回だけ登録するのと同じ効果があります。
- poll.modify(fd, eventmask)
- すでに登録されているfdを変更します。 これは
register(fd, eventmask)
と同じ効果があります。 登録されていないファイル記述子を変更しようとすると、エラー番号ENOENT
で OSError 例外が発生します。
- 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 を発生させる代わりに。
18.3.4。 Kqueueオブジェクト
- kqueue.close()
- kqueueオブジェクトの制御ファイル記述子を閉じます。
- kqueue.closed
True
kqueueオブジェクトが閉じている場合。
- kqueue.fileno()
- コントロールfdのファイル記述子番号を返します。
- kqueue.fromfd(fd)
- 指定されたファイル記述子からkqueueオブジェクトを作成します。
- kqueue.control(changelist, max_events[, timeout=None]) eventlist
keventへの低レベルのインターフェース
チェンジリストは、keventオブジェクトまたは
None
の反復可能である必要がありますmax_eventsは0または正の整数でなければなりません
秒単位のタイムアウト(フロート可能)
バージョン3.5で変更:シグナルハンドラーが例外を発生させた場合を除いて、シグナルによって中断されたときに関数が再計算されたタイムアウトで再試行されるようになりました( PEP 475 を参照)理論的根拠のために)、 InterruptedError を発生させる代わりに。
18.3.5。 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
- ユーザー定義の値。