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 ...
随机推荐
- mysql 5.6.20 数据库中文乱码解决方法
1.打开mysql5.6安装目录下面的文件my-default.ini在[client]下面添加default-character-set=utf8(如果没有[client]自己手动添加).然后在[m ...
- UITextField/UITextView限制字数
一,UITextFild限制字数(三步) 1,给textfild添加响应事件,类型为:UIControlEventEditingChanged [self.nickNameFild addTarget ...
- 类似Unity的全新游戏引擎Godot
http://www.godotengine.org/wp/ Godot是一个全新开发的游戏引擎,其功能集类似知名的跨平台游戏引擎Unity,可用于开发PC.主机.移动和Web游戏.开发者声称引 擎的 ...
- Mysql root密码忘记的解决办法
Windows 版本: 1.打开安装目录下的my.ini 找到 [mysqld] 在下面加入 skip-grant-tables 2. 重启mysql服务 3.打开命令行 依次输入 USE mysql ...
- UVALive 7712 Confusing Manuscript 字典树 查询与s的编辑距离为1的字符串数量
/** 题目:UVALive 7712 Confusing Manuscript 链接:https://vjudge.net/problem/UVALive-7712 题意:给定n个不同的字符串,f( ...
- hdu6007 Mr. Panda and Crystal 最短路+完全背包
/** 题目:hdu6007 Mr. Panda and Crystal 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6007 题意:魔法师有m能量,有n ...
- python笔记8 - excel操作
前提: python操作excel需要使用的模块有xlrd.xlwt.xlutils.对excel进行读.写.更新操作.操作excel时需要先导入这些模块,demo如下: excel-读操作知识点: ...
- base 64
我们的图片大部分都是可以转换成base64编码的data:image. 这个在将canvas保存为img的时候尤其有用.虽然除ie外,大部分现代浏览器都已经支持原生的基于base64的encode和d ...
- WPFLoading遮层罩
一直想实现这么个功能来着,所以去网上搜了资料,复杂的看不懂,后来挑了一个最简单的,复用了这位大神的很多代码(大神看到了别打脸).这位大神是用UserControl,使用时则是调用用户控件中的方法.之前 ...
- 三角矩阵怎么用MathType输入
虽然现在已经是暑假,但还是有很多学霸们在炎炎夏日中努力奋战,连暑假都不放过.也许正在实验室里面做得昏天暗地,也许是正在跟数据努力奋战,也许还在办公室里面一点一点地码着论文.码论文的时候,不时地要敲着复 ...