セレクター —高レベルI / O多重化
バージョン3.4の新機能。
ソースコード: :source: `Lib / selectors.py`
序章
このモジュールは、 select モジュールプリミティブに基づいて構築された高レベルで効率的なI / O多重化を可能にします。 使用するOSレベルのプリミティブを正確に制御したい場合を除いて、代わりにこのモジュールを使用することをお勧めします。
BaseSelector 抽象基本クラスと、I / O準備通知を待機するために使用できるいくつかの具体的な実装( KqueueSelector 、 EpollSelector …)を定義します。複数のファイルオブジェクト。 以下で、「ファイルオブジェクト」とは、fileno()
メソッドを持つ任意のオブジェクトまたは生のファイル記述子を指します。 ファイルオブジェクトを参照してください。
DefaultSelector は、現在のプラットフォームで利用可能な最も効率的な実装のエイリアスです。これは、ほとんどのユーザーにとってデフォルトの選択肢です。
ノート
サポートされるファイルオブジェクトのタイプはプラットフォームによって異なります。Windowsではソケットはサポートされますがパイプはサポートされませんが、Unixでは両方がサポートされます(fifosや特別なファイルデバイスなど、他のタイプもサポートされる場合があります)。
クラス
クラス階層:
BaseSelector
+-- SelectSelector
+-- PollSelector
+-- EpollSelector
+-- DevpollSelector
+-- KqueueSelector
以下では、 events は、特定のファイルオブジェクトで待機する必要があるI / Oイベントを示すビット単位のマスクです。 以下のモジュール定数の組み合わせにすることができます。
絶え間ない 意味 EVENT_READ
読むことができます EVENT_WRITE
書き込み可能
- class selectors.SelectorKey
SelectorKey は、ファイルオブジェクトをその基になるファイル記述子、選択されたイベントマスク、および添付データに関連付けるために使用される namesedtuple です。 これは、いくつかの BaseSelector メソッドによって返されます。
- fileobj
ファイルオブジェクトが登録されました。
- fd
基になるファイル記述子。
- events
このファイルオブジェクトで待機する必要のあるイベント。
- data
このファイルオブジェクトに関連付けられたオプションの不透明(OPAQUE)データ:たとえば、これを使用してクライアントごとのセッションIDを保存できます。
- class selectors.BaseSelector
BaseSelector は、複数のファイルオブジェクトでのI / Oイベントの準備を待機するために使用されます。 これは、ファイルストリームの登録、登録解除、およびオプションのタイムアウトを使用して、これらのストリームでI / Oイベントを待機するメソッドをサポートします。 これは抽象基本クラスであるため、インスタンス化できません。 代わりに DefaultSelector を使用するか、 SelectSelector 、 KqueueSelector などのいずれかを使用してください。 特に実装を使用したい場合で、プラットフォームがそれをサポートしている場合。 BaseSelector とその具体的な実装は、コンテキストマネージャープロトコルをサポートします。
- modify(fileobj, events, data=None)
登録されたファイルオブジェクトの監視対象イベントまたは添付データを変更します。
これは、
BaseSelector.unregister(fileobj)()
の後にBaseSelector.register(fileobj, events, data)()
が続くのと同じですが、より効率的に実装できる点が異なります。これにより、新しい SelectorKey インスタンスが返されるか、イベントマスクまたはファイル記述子が無効な場合は ValueError が発生し、ファイルオブジェクトが登録されていない場合は KeyError が発生します。
- close()
セレクターを閉じます。
これは、基になるリソースが解放されていることを確認するために呼び出す必要があります。 セレクターは、閉じた後は使用しないでください。
- get_key(fileobj)
登録されたファイルオブジェクトに関連付けられたキーを返します。
これにより、このファイルオブジェクトに関連付けられている SelectorKey インスタンスが返されます。ファイルオブジェクトが登録されていない場合は、 KeyError が発生します。
- class selectors.DefaultSelector
- 現在のプラットフォームで利用可能な最も効率的な実装を使用した、デフォルトのセレクタークラス。 これは、ほとんどのユーザーにとってデフォルトの選択です。
- class selectors.SelectSelector
- select.select()ベースのセレクター。
- class selectors.PollSelector
- select.poll()ベースのセレクター。
- class selectors.EpollSelector
- select.epoll()ベースのセレクター。
- fileno()
- これは、基礎となる select.epoll()オブジェクトによって使用されるファイル記述子を返します。
- class selectors.DevpollSelector
select.devpoll()ベースのセレクター。
- fileno()
これは、基礎となる select.devpoll()オブジェクトによって使用されるファイル記述子を返します。
バージョン3.5の新機能。
- class selectors.KqueueSelector
- select.kqueue()ベースのセレクター。
- fileno()
- これは、基礎となる select.kqueue()オブジェクトによって使用されるファイル記述子を返します。
例
簡単なエコーサーバーの実装は次のとおりです。
import selectors
import socket
sel = selectors.DefaultSelector()
def accept(sock, mask):
conn, addr = sock.accept() # Should be ready
print('accepted', conn, 'from', addr)
conn.setblocking(False)
sel.register(conn, selectors.EVENT_READ, read)
def read(conn, mask):
data = conn.recv(1000) # Should be ready
if data:
print('echoing', repr(data), 'to', conn)
conn.send(data) # Hope it won't block
else:
print('closing', conn)
sel.unregister(conn)
conn.close()
sock = socket.socket()
sock.bind(('localhost', 1234))
sock.listen(100)
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept)
while True:
events = sel.select()
for key, mask in events:
callback = key.data
callback(key.fileobj, mask)