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 ...
随机推荐
- Ubuntu12.04安装vim7.3
刚开始使用Linux的新手,Ubuntu的软件中心可以直接安装vim,个人觉得那样跟windows就没啥区别了,借vim正好也学习一下Linux的编译安装方法,记录一下. Linux下有很多安装形式, ...
- php安装redis扩展初始化失败解决办法
错误信息如下: PHP Warning: PHP Startup: redis: Unable to initialize module Module compiled with module API ...
- 设置EntityFramework中decimal类型数据精度
EF中默认的decimal数据精度为两位数,当我们数据库设置的精度大于2时,EF将只会保留到2为精度. e.g. 2.1999将会被保存为2.20 网上找到常见的方法为重写DbContext的OnMo ...
- Android开源-NineOldAndroids
开源地址: https://github.com/JakeWharton/NineOldAndroids 简单介绍:NineOldAndroids是一款支持在低版本号开发的Android动画的框架 包 ...
- landa语法
sg_orm看当前sql信息 db.IsEnableLogEvent = true; db.LogEventStarting = (sql, pa) => { var t = 0; }; //出 ...
- LeetCode 第 231 题 (Power of Two)
LeetCode 第 231 题 (Power of Two) Given an integer, write a function to determine if it is a power of ...
- Laravel5.1 模型 --多态关联
什么是多态关联? 一个例子你就明白了:好比如说评论 它可以属于视频类 也可以属于文章类,当有个需求是 从评论表中取到视频类的数据,这就需要用到多态关联了. 简单的一句话总结:一张表对应两张表. 1 实 ...
- Castle 整合.NET Remoting
今天研究了一下Castle的Remoting Facility.记录如下: 微软以前使用COM/DCOM的技术来处理分布式系统架构,通过Client端的Proxy代理程序来呼叫远程Server机器上的 ...
- Array转为Json需要导入的包
今天自己写了一个JSON的例子,可以一调用就出了问题,报下面这个异常: java.lang.ClassNotFoundException: org.apache.commons.lang.except ...
- C/C++求职宝典重点笔记
这是我之前准备找工作时看<C/C++求职宝典>一书做的笔记,都是一些笔试面试中常考的重点难点问题,但比较基础,适合初学者看. 1. char c = '\72'; 中的\72代表一个字符, ...