selectors高级I / O多路复用 – 网络和进程间通信(Python教程)(参考资料)
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
SelectorKey
是namedtuple
用于将文件对象与其基础文件描述符,选定的事件掩码和附加数据相关联。它被几个BaseSelector
methods.fileobj
- 文件对象注册了
fd
- 下载文件描述符.
events
- 这个文件对象必须等待的事件。
data
- 与此文件对象关联的可选opaque数据:例如,这可用于存储每个客户端的会话ID.
- class
selectors.
BaseSelector
- A
BaseSelector
用于等待多个文件对象的I / O事件就绪。它支持文件流注册,取消注册和等待这些流上的I / O事件的方法,具有可选的timeout.It是一个抽象基类,因此无法实例化。使用DefaultSelector
相反,或SelectSelector
,KqueueSelector
之一,如果你想专门使用实现,你的平台支持它.BaseSelector
及其具体实现支持上下文管理器 协议。- abstractmethod
register
(fileobj, events, data=None) - 注册一个文件对象以供选择,监视它以进行I / O事件.
fileobj是要监视的文件对象。它可以是整数文件描述符,也可以是
fileno()
方法的对象.events是一个监视事件的按位掩码.data是一个不透明的物体.这将返回一个新的
SelectorKey
例如,或者举起一个ValueError
如果事件掩码或文件描述符无效,或者KeyError
如果文件对象已经注册了
- abstractmethod
unregister
//(fileobj) - 从选择中取消注册文件对象,将其从监视中删除。在关闭之前,应该注销未使用的物品.
fileobj必须是以前注册的文件对象.
这将返回相关的
SelectorKey
例如,或者举起一个KeyError
如果fileobj没有注册。它会提升ValueError
如果fileobj无效(例如它没有fileno()
方法或其fileno()
方法的返回值无效).
modify
(fileobj, events, data=None)- 更改已注册文件对象的受监视事件或附加数据.
这相当于
BaseSelector.unregister(fileobj)()
跟随BaseSelector.register(fileobj, events, data)()
,除了它可以更有效地实现.这会返回一个新的
SelectorKey
实例,或者引发ValueError
如果无效的事件掩码或文件描述符,或KeyError
如果文件对象没有注册.
- abstractmethod
select
(timeout=None ) - 等到一些注册文件物体准备就绪,或者时间准备好了
如果
timeout > 0
,则指定最长等待时间,以秒为单位。如果timeout <= 0
,则调用不会阻塞,并将报告当前已经存在的文件对象。如果timeout是None
,调用将阻塞,直到受监视的文件对象准备就绪.这将返回
(key, events)
元组,每个准备好的文件对象一个key是个
SelectorKey
对应于ready fileject的实例.events是在这个文件对象上准备好的事件的位掩码.注意
如果当前进程收到信号,则此方法可以在任何文件对象准备就绪之前返回,或者超时时间已经过去:在这种情况下,将返回一个空列表.
在版本3.5中更改:如果信号处理程序没有引发异常(例如 PEP 475 为了理由),而不是在超时之前返回一个空的事件列表.
get_key
(fileobj )- 返回与注册文件对象关联的密钥.
这将返回
SelectorKey
与此文件对象关联的实例,或者引发KeyError
如果文件对象没有注册.
- abstractmethod
get_map
() - 返回文件对象到选择键的映射.
这会将
Mapping
实例映射注册的文件对象返回到它们关联的SelectorKey
instance.
- abstractmethod
- 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)