python 标准库 selectors 高级 I/O 复用库
源码: Lib/selectors.py
概述
它的功能与linux的epoll,还是select模块,poll等类似;实现高效的I/O multiplexing, 常用于非阻塞的socket的编程中
模块定义了一个 BaseSelector的抽象基类, 以及它的子类,包括:EpollSelector, KqueueSelector等模块,
类
Classes hierarchy:
1 | BaseSelector |
模块定义了两个常量,用于描述 event Mask
常数 | 意义 |
---|---|
EVENT_READ |
可读 |
EVENT_WRITE |
可写 |
模块定义了一个 SelectorKey类,是一个 namedtuple
类型, 一般用这个类的实例来描述一个已经注册的文件对象的状态,
常用属性:
属性 | 描述 |
---|---|
fileobj | 表示已经注册的文件对象 |
fd | 表示文件对象的描述符,是一个整数,它是文件对象的 fileno()方法的返回值 |
events | 表示注册一个文件对象时,我们等待的events, 即上面的event Mask, 是可读呢还是可写 |
data | 表示注册一个文件对象是邦定的data |
class selectors.BaseSelector
定义了一个抽象基类,能够注册和取消注册,通过一个可选的timeout,等待流中的I/O事件。抽象基类无法实例化,所以通常使用DefaultSelector
代替,或者SelectSelector`, KqueueSelector
来实现。如果你想声明一个操作系统平台支持的实现, BaseSelector
和他的子类支持 上下文管理 实现。
abstractmethod
register
(fileobj, events, data=None)用于注册一个文件对象或监控I/O事件的抽象方法。fileobj 参数是一个用于监控的对象。它可能是一个整形文件描述符或者是一个拥有
fileno()
方法的对象。返回一个新创建的SelectorKey` 类实例,或因为不存在的event mask
或文件描述符,或者该文件对象已经被注册过而引发ValueError
异常。abstractmethod
unregister
(fileobj)用于注销注册文件对象或移除监控I/O事件的抽象方法。该文件对象必须是之前已经注册的对象。返回值关联了
SelectorKey
实例,或因为不存在的event mask
或文件描述符,或者该文件对象已经被注册过而引发ValueError
异常。modify
(fileobj, events, data=None)用于修改一个注册过的文件对象,比如从监听可读变为监听可写;它其实就是register() 后再跟unregister(), 但是使用modify( ) 更高效;返回一个新创建的SelectorKey` 类实例,或因为不存在的
event mask
或文件描述符,或者该文件对象已经被注册过而引发ValueError
异常。abstractmethod
select
(timeout=None)用于选择满足我们监听的event的文件对象的抽象方法。
close
()关闭 selector,为了 要确保所有的资源被释放,最后一定要调用该方法。
get_key
(fileobj)返回注册文件对象的
SelectorKey
实例。该实例关联文件对象,若文件对象未注册,将抛出KeyError
异常。abstractmethod
get_map
()返回selectors key 的文件对象的映射。
class
selectors.DefaultSelector
默认的selector类,其中一个子类的别名,它自动选择为当前环境中最有效的Selector。
selectors模块默认会用epoll,如果你的系统中没有epoll(比如windows)则会自动使用select
class
selectors.SelectSelector
select.select()
-based selector.class
selectors.PollSelector
select.poll()
-based selector.class
selectors.EpollSelector
select.epoll()
-based selector.fileno
()This returns the file descriptor used by the underlyingselect.epoll()
object.class
selectors.DevpollSelector
select.devpoll()
-based selector.fileno
()This returns the file descriptor used by the underlyingselect.devpoll()
object.3.5 新版功能.class
selectors.KqueueSelector
select.kqueue()
-based selector.fileno
()This returns the file descriptor used by the underlyingselect.kqueue()
object.
官方示例
Here is a simple echo server implementation:
1 | import selectors |
一个基于socket的客户端与服务器端实例
基于socket的服务器端实例
1 | selectors_echo_server.py |
基于socket的客户端实例
1 | selectors_echo_client.py |
Server和client交互
1 | $ python3 source/selectors/selectors_echo_server.py |
1 | $ python3 source/selectors/selectors_echo_client.py |