Python - selectors 模块
selectors 模块
它的功能与 linux 的 epoll,还是 select 模块, poll 等类似;
实现高效的 I/O multiplexing , 常用于非阻塞的 socket 的编程中
官方文档
内部类
▤ BaseSelector
▧ SelectSelector
▧ PollSelector
▧ EpollSelector
▧ DevpollSelector
▧ KqueueSelector
▤ DefaultSelector
实际使用为此类, 自动选择为当前环境中最有效的 Selector ,
所以平时用 DefaultSelector 类就可以了,其它用不着
定义事件类型
▤ EVENT_READ - 表示可读
▤ EVENT_WRITE - 表示可写
SelectorKey类
模块定义了一个 SelectorKey 类, 一般用这个类的实例 来描述一个已经注册的文件对象的状态, 这个类的几个属性常用到:
▤ fileobj - 表示已经注册的文件对象;
▤ fd - 表示文件对象的描述符,是一个整数,它是文件对象的 fileno() 方法的返回值;
▤ events - 表示注册一个文件对象时,我们等待的 events , 即上面的 event Mask , 是可读呢还是可写呢!!
▤ data - 表示注册一个文件对象是邦定的 data ;
常用方法
register(fileobj, events, data=None)
作用
注册一个文件对象。
参数
fileobj 即可以是fd 也可以是一个拥有 fileno() 方法的对象;
events上面的 event Mask 常量 data
返回值
一个 SelectorKey 类的实例
unregister(fileobj)
作用
注销一个已经注册过的文件对象;
返回值
一个 SelectorKey 类的实例
modify(fileobj, events, data=None)
作用
用于修改一个注册过的文件对象,比如从监听可读变为监听可写
它其实就是 register() 后再跟 unregister()
但是使用 modify() 更高效
返回值
一个 SelectorKey 类的实例
select(timeout=None)
作用
用于选择满足我们监听的 event 的文件对象
返回值
是一个 (key, events) 的元组,
其中 key 是一个 SelectorKey 类的实例,
而 events 就是 event Mask ( EVENT_READ 或 EVENT_WRITE ,或者二者的组合)
close()
作用
关闭 selector
最后一定要记得调用它, 要确保所有的资源被释放;
get_key(fileobj)
作用
返回注册文件对象的 key ;
返回值
一个 SelectorKey 类的实例;
实例
官方实例
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) def read(conn, mask):
data = conn.recv(1000) # 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', 1234))
sock.listen(100)
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept) while True:
events = sel.select()
for key, mask in events:
callback = key.data
callback(key.fileobj, mask)
易懂实例
#!/usr/bin/python import selectors
import socket # selectors模块默认会用epoll,如果你的系统中没有epoll(比如windows)则会自动使用select
sel = selectors.DefaultSelector() # 生成一个select对象 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回调函数 def read(conn, mask):
data = conn.recv(1024) # Should be ready
if data:
print('echoing', repr(data), 'to', conn)
conn.send(data)
else:
print('closing', conn)
sel.unregister(conn)
conn.close() sock = socket.socket()
sock.bind(('localhost', 8080))
sock.listen()
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept) # 把刚生成的sock连接对象注册到select连接列表中,并交给accept函数处理 while True:
events = sel.select() # 默认是阻塞,有活动连接就返回活动的连接列表
# 这里看起来是select,其实有可能会使用epoll,如果你的系统支持epoll,那么默认就是epoll
for key, mask in events:
callback = key.data # 去调accept函数
callback(key.fileobj, mask) # key.fileobj就是readable中的一个socket连接对象
Python - selectors 模块的更多相关文章
- Python/ selectors模块及队列
Python/selectors模块及队列 selectors模块是可以实现IO多路复用机制: 它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默 ...
- python selectors模块实现 IO多路复用机制的上传下载
import selectorsimport socketimport os,time BASE_DIR = os.path.dirname(os.path.abspath(__file__))''' ...
- (转)python异步编程--回调模型(selectors模块)
原文:https://www.cnblogs.com/zzzlw/p/9384308.html#top 目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分 ...
- python异步编程--回调模型(selectors模块)
目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分析 3.1 注册 3.2 注销 3.3 查询 4. 别名 5. 总结 6. 代码报错问题 1. 文件描述 ...
- python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...
- {python之IO多路复用} IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) IO模型比较分析 selectors模块
python之IO多路复用 阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 ...
- python之selectors模块
python之selectors模块 selectors模块是在python3.4版本中引进的,它封装了IO多路复用中的select和epoll,能够更快,更方便的实现多并发效果. 官方文档见:htt ...
- day33 网络编程之线程,并发以及selectors模块io多路复用
io多路复用 selectors模块 概要: 并发编程需要掌握的知识点: 开启进程/线程 生产者消费者模型!!! GIL全局解释器锁(进程与线程的区别和应用场景) 进程池线程池 IO模型(理论) 1 ...
- SELECTORS模块实现并发简单版FTP
环境:windows, python 3.5功能:使用SELECTORS模块实现并发简单版FTP允许多用户并发上传下载文件 结构:ftp_client ---| bin ---| start_clie ...
随机推荐
- Delphi 方法的声明
- windows10 L2tP nat 下无法连接的处理
事件查看器中没有错误代码显示. Windows 10 L2TP/IPsec Manual Setup Instructions Bold items are things you will click ...
- PAT Basic 1052 卖个萌 (20 分)
萌萌哒表情符号通常由“手”.“眼”.“口”三个主要部分组成.简单起见,我们假设一个表情符号是按下列格式输出的: [左手]([左眼][口][右眼])[右手] 现给出可选用的符号集合,请你按用户的要求输出 ...
- Pc贪吃蛇
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- zencart价格筛选插件
1.首先,新建文件includes\modules\sideboxes\price_range.php <?php function zen_count_products_in_price($p ...
- java线程基础巩固---策略模式在Thread和Runnable中的应用分析
在上篇[http://www.cnblogs.com/webor2006/p/7709647.html]中已经学习了Runnable出现的好处,其实这种设计是采用的一种策略模式,所以为了进一步理解Ru ...
- Linux之ln文件创建链接
ln命令用来为文件创建链接,链接类型分为硬链接和软链接(符号链接)两种 1)软连接和Windows系统中的快捷方式有点类似 2)硬链接,相当于多了一个文件名指向同一块内存空间,目录无法创建硬链接,不可 ...
- 03—mybatis的基本用法02
深入Mapper XML映射文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它的异常强大,映射器的 XML 文件就显得相对简单.如果拿它跟具有相同功能的 JDBC 代码进行对比 ...
- 灵活部署django缓存,并使用
使用django内置的redis=============>pip3 install django-redisCACHES = { 'default':{ 'BACKEND':'django_r ...
- .net 密码明文传输 加密传递方法
未加密传递是这样的 html标签加密使用的是jquery.md5.js 自行官网下载 html代码 <head runat="server"> <meta ht ...