selector
  selectors模块,
此模块允许高级和高效的I / O多路复用,构建在select模块原语上。鼓励用户使用此模块,除非他们需要精确控制所使用的操作系统级原语。( 默认使用epoll,但由于Windows不支持epoll,如果在你的Windows上找不到epoll的话,就会用select)
   它定义了一个抽象基类,有几个具体的实现工具(KqueueSelector, EpollSelector...),可以用于等待多个文件对象的I / O就绪通知。在下文中,file object” 指的是任何fileno() method,或一个原始文件的描述符。请参阅文件对象。BaseSelectorKqueueSelectorEpollSelectorfileno()
 DefaultSelector是别名到当前平台上可用的最有效的实现:这应该是大多数用户的默认选择
注意支持的文件对象类型取决于平台:在Windows上,支持套接字,但不支持管道,而在Unix上,支持两者(也可以支持其他类型,例如fifos或特殊文件设备) select -->Low-level I/O multiplexing module. 低级IO多路复用模块 Classes hierarchy: 类层次结构
BaseSelector
+-- SelectSelector
+-- PollSelector
+-- EpollSelector
+-- DevpollSelector
+-- KqueueSelector 在下文中,事件是指示哪些I / O事件,应等待一个给定的文件对象上的位掩码。它可以是下面的模块常量的组合: 常量 含义
EVENT_READ 可用于读取
EVENT_WRITE 可用于写入 class selectors.SelectorKey
SelectorKey是一个命名的元组,用于将文件对象与其基础文件描述符,所选事件掩码和附加数据相关联。它由几个BaseSelector方法返回。   fileobj
 已注册文件对象。   fd
 底层的文件描述符。   events
 必须等待该文件对象上的事件。   data
 关联到该文件对象可选不透明数据:例如,这可以被用来存储每个客户端的会话ID。 class selectors.BaseSelector;
A BaseSelector is used to wait for I/O event readiness on multiple file objects. It supports file stream registration, unregistration, and a method to wait for I/O events on those streams, with an optional timeout. It’s an abstract base class, so cannot be instantiated. Use DefaultSelector instead, or one of SelectSelector, KqueueSelector etc. if you want to specifically use an implementation, and your platform supports it. BaseSelector and its concrete implementations support the context manager protocol.
BaseSelector用于等待多个文件对象的I / O事件就绪。它支持文件流注册,注销和一种方法来等待这些流上的I / O事件,并具有可选的超时。它是一个抽象的基类,所以不能实例化。如果您想要专门使用实现,请使用DefaultSelector,或者选择SelectSelector,KqueueSelector等之一,而您的平台支持它。 BaseSelector及其具体实现支持上下文管理器协议。   abstractmethod register(fileobj, events, data=None)注册一个文件对象供选择,监测它的I / O事件。
 FileObj文件是文件要监视的对象。它可以是一个整数文件描述符或具有一个对象fileno()的方法。 事件是要监视的事件的位掩码。 数据是一个不透明的对象。
 这将返回一个新的实例,或者提出了一个 无效的事件面罩或文件描述符的情况下,或者 如果该文件对象已注册。SelectorKeyValueErrorKeyError   abstractmethod unregister(fileobj从选择注销一个文件对象,从监控中移除。一个文件对象应被关闭之前被注销。
 FileObj文件必须是一个文件对象之前注册。
 这返回相关的SelectorKey实例,或者如果没有注册fileobj则引发一个KeyError。如果fileobj无效(例如它没有fileno()方法或者它的fileno()方法有一个无效的返回值,它将引发ValueError)。   modify(fileobj, events, data=None)更改注册的文件对象的监控事件或连接数据。
 这相当于BaseSelector.unregister(fileobj)()后跟BaseSelector.register(fileobj,events,data)(),除了它可以更有效地实现。
 这将返回一个新的SelectorKey实例,或者在无效事件掩码或文件描述符的情况下引发ValueError,如果文件对象未注册,则引发KeyError。   abstractmethod select(timeout=None)等到一些已注册的文件对象准备就绪,或超时。
 如果timeout> 0,则指定最大等待时间(以秒为单位)。如果timeout <= 0,调用将不会阻塞,并且将报告当前准备好的文件对象。如果超时为无,调用将阻塞,直到受监视的文件对象准备就绪。
这返回一个(key, events)元组的列表,每个准备好的文件对象一个。
 key是与ready文件对象相对应的SelectorKey实例。事件是在此文件对象上准备好的事件的位掩码。
 注意 在这种情况下,一个空的列表将返回:之前的任何文件对象准备好,或者当前进程收到信号超时已过这种方法可以返回。
 在3.5版本中改为:该选择现在重新尝试时信号中断,如果信号处理程序并没有引发异常的重新计算超时(见 PEP 475的理由),而不是超时之前返回事件的空列表。   close()
 关闭selector.
 这必须被调用以确保任何基础资源被释放。选择器一旦关闭,不得使用。   get_key(fileobj)
 返回与注册文件对象相关联的键。
 这将返回与此文件对象关联的SelectorKey实例,或者如果文件对象未注册,则引发KeyError。   abstractmethod get_map()
Return a mapping of file objects to selector keys.返回文件对象到selector keys的映射。
这将返回一个映射实例,将注册的文件对象映射到其关联的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()对象。
在新版本3.5。 class selectors.KqueueSelector
select.kqueue()-based selector.   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)#这次的回调函数变为read,不再是accept,只要有新连接进来就注册read回调函数 def read(conn, mask):
data = conn.recv(1024) # 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', 10000))
sock.listen(100)
sock.setblocking(False)#设置为非阻塞模式
sel.register(sock, selectors.EVENT_READ, accept)#注册到sel while True:
events = sel.select()# 默认为阻塞,不阻塞代表有新连接进来,有活动连接就返回活动连接列表
for key, mask in events:
callback = key.data #相当于accept,
# 一有连接进来就调用accept
callback(key.fileobj, mask)#key.fileobj=文件句柄

example

 
05-11 15:25