selector模块
- 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
selector模块的更多相关文章
- 读Zepto源码之Selector模块
Selector 模块是对 Zepto 选择器的扩展,使得 Zepto 选择器也可以支持部分 CSS3 选择器和 eq 等 Zepto 定义的选择器. 在阅读本篇文章之前,最好先阅读<读Zept ...
- selector 模块
selector 模块进行自动匹配,当是windows系统时,自动匹配select, linux系统时,自动匹配epoll,传输时会明确告诉内核响应服务器的地址,速度要更快 import select ...
- 190707select和selector模块
一.select模块 Python select socket server代码示例 # Author:Li Dongfei import select, socket, sys, queue ser ...
- python基础(17)-IO模型&selector模块
先说一下IO发生时涉及的对象和步骤.对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(k ...
- python使用selector模块编写FTP
server import os import socket import time import selectors BASE_DIR = os.path.dirname(os.path.abspa ...
- selector模块使用
#服务端 from socket import * import selectors sel=selectors.DefaultSelector() def accept(server_fileobj ...
- RequireJS入门之二——第二例(写自己的模块)
第一节遗留的问题: 中文乱码: 修改require.js文件,搜索charset 关键字,修改为GBK:(貌似乱不乱码和jquery版本有问题,切换GBK和utf-8!!) 路 径: 仅 ...
- 读Zepto源码之Touch模块
大家都知道,因为历史原因,移动端上的点击事件会有 300ms 左右的延迟,Zepto 的 touch 模块解决的就是移动端点击延迟的问题,同时也提供了滑动的 swipe 事件. 读 Zepto 源码系 ...
- 读Zepto源码之Gesture模块
Gesture 模块基于 IOS 上的 Gesture 事件的封装,利用 scale 属性,封装出 pinch 系列事件. 读 Zepto 源码系列文章已经放到了github上,欢迎star: rea ...
随机推荐
- List、Set、Map集合大杂烩
java集合主要分三种:list.set.map:当中list和set都继承自Collection接口,两者最大差别是set不能包括反复元素 list的经常使用实现类有: ArrayList:大小可变 ...
- CSS border-style 属性查询
border-style 属性用于设置元素所有边框的样式,或者单独地为各边设置边框样式.只有当这个值不是 none 时边框才可能出现. none solid dotted dashed double ...
- Java 中 byte 类型初始化问题
很早的时候由于工作需要,接触过一点 Java,于是有了这个坑,今天回头看到自己在 Stackoverflow 上提的问题发现了它,于是再记录下. 在使用中,需要将 byte 类型的的每一位都置 1.我 ...
- char类型能否存储一个中文字符?为什么
char类型能否存储一个中文字符?为什么 解答:可以.一个char是两个字节,而一个中文也是两个字节.
- Openstack(Kilo)安装系列之neutron(九)
控制节点 Before you configure the OpenStack Networking (neutron) service, you must create a database, se ...
- ubuntu 自动清理/tmp目录
在Ubuntu系统中,在/tmp文件夹里面的内容,每次开机都会被清空,如果不想让他自动清理的话,只需要更改rcS文件中的TMPTIME的值. 我们看如何来修改 sudo vi /etc/default ...
- Linux的文件权限(简单易懂)
学习这个章节,必须明白以下三个概念: 1.所有者 2.所属组 3.其他人 明白这三个概念后,接下来就学习文件的属性,那么文件的属性有什么呢?如何查看文件的属性? 在命令行下,执行 ls -l 可以得到 ...
- 《linux系统及其编程》实验课记录(二)
实验 2:获取对使用命令的帮助 实验环境: 安装了 Red Hat Enterprise Linux 6.0 可运行系统,并且是成功验证系统.有另外一个无特权用户 student,密码 student ...
- 【Python】求素数-未经过任何优化
print 'Find prime number smaller then input number \n' print 'Please input a number:' import time nu ...
- C++ Base64编码解码、MD5及TEA加密解密
Crypto.h以及Crypto.cpp Crypto.h 123456789101112131415161718192021222324252627282930313233343536373839 ...