selectors– 高级I / O多路复用

版本3.4.

源代码:LIB / selectors.py


介绍

该模块允许基于select模块原语。鼓励用户使用此模块,除非他们想要精确控制所使用的操作系统级原语.

它定义了BaseSelector抽象基类,以及几个具体实现(KqueueSelector, EpollSelector…),可用于等待多个文件对象的I / O准备就绪通知。在下文中,“文件对象”是指具有fileno()方法或原始文件描述符的任何对象。见文件对象.

DefaultSelector是当前平台上最有效的实现的别名:这应该是大多数用户的默认选择.

注意

支持的文件对象的类型取决于平台:在Windows上,支持套接字,但不支持管道,而在Unix上,两者都受支持(也可以支持其他类型,例如fifos或特殊文件设备).

另见

select
低级I / O多路复用模块.

类层次:

BaseSelector
+-- SelectSelector
+-- PollSelector
+-- EpollSelector
+-- DevpollSelector
+-- KqueueSelector

下面,events是一个按位掩码,指示应该在给定的文件对象上等待哪些I / O事件。它可以是下面的模块常量的组合:

常量 含义
EVENT_READ 可用于读取
EVENT_WRITE 可用于写入
class selectors.SelectorKey
A SelectorKeynamedtuple用于将文件对象与其基础文件描述符,选定的事件掩码和附加数据相关联。它被几个BaseSelectormethods.

fileobj
文件对象注册了
fd
下载文件描述符.
events
这个文件对象必须等待的事件。
data
与此文件对象关联的可选opaque数据:例如,这可用于存储每个客户端的会话ID.
class selectors.BaseSelector
A BaseSelector用于等待多个文件对象的I / O事件就绪。它支持文件流注册,取消注册和等待这些流上的I / O事件的方法,具有可选的timeout.It是一个抽象基类,因此无法实例化。使用DefaultSelector相反,或SelectSelector,KqueueSelector之一,如果你想专门使用实现,你的平台支持它.BaseSelector及其具体实现支持上下文管理器 协议。

abstractmethod registerfileobj, events, data=None
注册一个文件对象以供选择,监视它以进行I / O事件.

fileobj是要监视的文件对象。它可以是整数文件描述符,也可以是fileno()方法的对象.events是一个监视事件的按位掩码.data是一个不透明的物体.

这将返回一个新的SelectorKey例如,或者举起一个ValueError如果事件掩码或文件描述符无效,或者KeyError如果文件对象已经注册了

abstractmethod unregister//(fileobj)
从选择中取消注册文件对象,将其从监视中删除。在关闭之前,应该注销未使用的物品.

fileobj必须是以前注册的文件对象.

这将返回相关的SelectorKey例如,或者举起一个KeyError如果fileobj没有注册。它会提升ValueError如果fileobj无效(例如它没有fileno()方法或其fileno()方法的返回值无效).

modifyfileobj, events, data=None
更改已注册文件对象的受监视事件或附加数据.

这相当于BaseSelector.unregister(fileobj)()跟随BaseSelector.register(fileobj, events, data)(),除了它可以更有效地实现.

这会返回一个新的SelectorKey实例,或者引发ValueError如果无效的事件掩码或文件描述符,或KeyError如果文件对象没有注册.

abstractmethod select (timeout=None )
等到一些注册文件物体准备就绪,或者时间准备好了

如果timeout > 0,则指定最长等待时间,以秒为单位。如果timeout <= 0,则调用不会阻塞,并将报告当前已经存在的文件对象。如果timeoutNone,调用将阻塞,直到受监视的文件对象准备就绪.

这将返回(key, events)元组,每个准备好的文件对象一个

key是个 SelectorKey对应于ready fileject的实例.events是在这个文件对象上准备好的事件的位掩码.

注意

如果当前进程收到信号,则此方法可以在任何文件对象准备就绪之前返回,或者超时时间已经过去:在这种情况下,将返回一个空列表.

在版本3.5中更改:如果信号处理程序没有引发异常(例如 PEP 475 为了理由),而不是在超时之前返回一个空的事件列表.

close ()
关闭选择器.

必须调用它以确保释放任何底层资源。选择器一旦关闭就不能使用.

get_key (fileobj )
返回与注册文件对象关联的密钥.

这将返回SelectorKey与此文件对象关联的实例,或者引发KeyError如果文件对象没有注册.

abstractmethod get_map
返回文件对象到选择键的映射.

这会将Mapping实例映射注册的文件对象返回到它们关联的SelectorKeyinstance.

class selectors.DefaultSelector
默认选择器类,使用当前平台上最有效的实现。这应该是formost用户的默认选择.
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()宾语。

例子

这是一个简单的echo服务器实现:

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)