セレクター—高レベルI / O多重化—Pythonドキュメント

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

セレクター —高レベルI / O多重化

バージョン3.4の新機能。


ソースコード: :source: `Lib / selectors.py`



序章

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

BaseSelector 抽象基本クラスと、I / O準備通知を待機するために使用できるいくつかの具体的な実装( KqueueSelectorEpollSelector …)を定義します。複数のファイルオブジェクト。 以下で、「ファイルオブジェクト」とは、fileno()メソッドを持つ任意のオブジェクトまたは生のファイル記述子を指します。 ファイルオブジェクトを参照してください。

DefaultSelector は、現在のプラットフォームで利用可能な最も効率的な実装のエイリアスです。これは、ほとんどのユーザーにとってデフォルトの選択肢です。

ノート

サポートされるファイルオブジェクトのタイプはプラットフォームによって異なります。Windowsではソケットはサポートされますがパイプはサポートされませんが、Unixでは両方がサポートされます(fifosや特別なファイルデバイスなど、他のタイプもサポートされる場合があります)。


も参照してください

select
低レベルI / O多重化モジュール。


クラス

クラス階層:

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 を使用するか、 SelectSelectorKqueueSelector などのいずれかを使用してください。 特に実装を使用したい場合で、プラットフォームがそれをサポートしている場合。 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)