源码: Lib/selectors.py
概述
这个模块允许高级和高效的I/O多路复用,建立在选择模块原语之上。鼓励用户使用此模块,除非他们希望对所使用的os级原语进行精确控制。
它定义了一个BaseSelector抽象基类,以及几个具体的实现(KqueueSelector,EpollSelector…),可以用于在多个文件对象上等待I/O就绪通知。在下文“文件对象”指任何具有fileno()方法或原始文件描述符的对象。
DefaultSelector是当前平台上可用的最有效实现的别名:这应该是大多数用户的默认选择。
类
类层次结构:
BaseSelector
+-- SelectSelector
+-- PollSelector
+-- EpollSelector
+-- DevpollSelector
+-- KqueueSelector
events是一个位掩码,指示在给定文件对象上应该等待哪些I/O事件。它可以是下列模块常量的组合:
常数 含义
EVENT_READ 可读
EVENT_WRITE 可写
class selectors.SelectorKey
SelectorKey是一个命名元组,用于将文件对象关联到其基础文件描述符、选定的事件掩码和附加数据。它由几个BaseSelector方法返回。
fileobj
注册的文件对象。
fd
文件描述符。
events
在此文件对象上等待的事件。
data
与此文件对象关联的可选不透明数据。
class selectors.BaseSelector
BaseSelector用于等待多个文件对象上的I/O事件准备就绪。它支持文件流注册、取消注册,以及等待这些流上的I/O事件的方法(带有可选的超时)。它是一个抽象基类,因此不能实例化。
如果你想使用一个实现,并且你的平台支持它,可以使用DefaultSelector,或者SelectSelector, KqueueSelector等等。BaseSelector及其具体实现支持上下文管理器协议。
abstractmethod register(fileobj, events, data=None)
注册一个文件对象进行选择,监视它的I/O事件。
fileobj是要监视的文件对象。它可以是一个整数文件描述符,也可以是一个具有fileno()方法的对象。事件是要监视的事件的位掩码。数据是一个不透明的对象。
这会返回一个新的SelectorKey实例,或者在事件掩码或文件描述符无效的情况下引发一个ValueError,或者在文件对象已经注册的情况下引发一个KeyError。
abstractmethod unregister(fileobj)
取消注册的文件对象,从监视中删除它。一个文件对象在被关闭之前应该被取消注册。
fileobj必须是先前注册的文件对象。
这会返回相关的SelectorKey实例,或者在fileobj未注册时引发一个键错误。如果fileobj无效(例如它没有fileno()方法,或者它的fileno()方法有一个无效的返回值),它将引发ValueError。
modify(fileobj, events, data=None)
更改已注册文件对象的监视事件或附加数据。
这相当于BaseSelector.unregister(fileobj)()后面跟着BaseSelector。寄存器(fileobj,事件,数据)(),除了它可以更有效地实现。
这将返回一个新的SelectorKey实例,或者在事件掩码或文件描述符无效的情况下引发一个ValueError,或者在文件对象未注册的情况下引发一个KeyError。
abstractmethod select(timeout=None)
等待,直到已注册的文件对象就绪,或者超时过期。
如果超时>为0,则指定最大等待时间,以秒为单位。如果timeout <= 0,调用将不会阻塞,并将报告当前准备好的文件对象。如果timeout为None,调用将阻塞,直到被监视的文件对象就绪。
这将返回一个元组(键、事件)列表,每个元组对应一个就绪文件对象。
key是SelectorKey实例,对应于一个就绪文件对象。events是这个文件对象上准备好的事件的位掩码。
close()
关闭选择器。必须调用它以确保释放所有底层资源。选择器一旦关闭,就不能使用。
get_key(fileobj)
返回与注册文件对象关联的键。
这将返回与此文件对象关联的SelectorKey实例,或者在文件对象未注册时引发KeyError。
abstractmethod get_map()
返回文件对象到选择器键的映射。
这将返回一个映射实例,将注册的文件对象映射到它们关联的SelectorKey实例。
class selectors.DefaultSelector
默认选择器类,使用当前平台上可用的最有效实现。这应该是大多数用户的默认选择。
class selectors.SelectSelector
select.select()-based selector.
class selectors.PollSelector
select.poll()-based selector.
class selectors.EpollSelector
select.epoll()-based selector.
fileno()
这将返回基础select.epoll()对象使用的文件描述符。
class selectors.DevpollSelector
select.devpoll()-based selector.
fileno()
这将返回基础select.devpoll()对象使用的文件描述符。
class selectors.KqueueSelector
select.kqueue()-based selector.
fileno()
这将返回底层select.kqueue()对象使用的文件描述符。