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 模块的更多相关文章

  1. Python/ selectors模块及队列

    Python/selectors模块及队列 selectors模块是可以实现IO多路复用机制: 它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默 ...

  2. python selectors模块实现 IO多路复用机制的上传下载

    import selectorsimport socketimport os,time BASE_DIR = os.path.dirname(os.path.abspath(__file__))''' ...

  3. (转)python异步编程--回调模型(selectors模块)

    原文:https://www.cnblogs.com/zzzlw/p/9384308.html#top 目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分 ...

  4. python异步编程--回调模型(selectors模块)

    目录 0. 参考地址 1. 前言 2. 核心类 3. SelectSelector核心函数代码分析 3.1 注册 3.2 注销 3.3 查询 4. 别名 5. 总结 6. 代码报错问题 1. 文件描述 ...

  5. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    昨日内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yield,greenlet 遇到IO gevent: 检测到IO,能够使用greenlet实现自动切换,规避了IO阻 ...

  6. {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) 五 ...

  7. python之selectors模块

    python之selectors模块 selectors模块是在python3.4版本中引进的,它封装了IO多路复用中的select和epoll,能够更快,更方便的实现多并发效果. 官方文档见:htt ...

  8. day33 网络编程之线程,并发以及selectors模块io多路复用

    io多路复用 selectors模块 概要: 并发编程需要掌握的知识点: 开启进程/线程 生产者消费者模型!!! GIL全局解释器锁(进程与线程的区别和应用场景) 进程池线程池 IO模型(理论) 1 ...

  9. SELECTORS模块实现并发简单版FTP

    环境:windows, python 3.5功能:使用SELECTORS模块实现并发简单版FTP允许多用户并发上传下载文件 结构:ftp_client ---| bin ---| start_clie ...

随机推荐

  1. nodejs建站+github page 建站问题总结

    本文介绍 昨天吃晚饭的时候,在B站偶然看到一个关于搭建自己博客的视频,过程讲的很详细,于是就有了自己想尝试一下的冲动,所以,在晚上的时候,尝试了下,但是,过程并没有视频中说的那么顺利,看了网上很多帖子 ...

  2. 从程序员之死看 IT 人士如何摆脱低情商诅咒

    (1) IT公司的创业者苏享茂忽然跳楼自杀了,自杀前,他留下几万字的文字记录.遗书,并且在自己开发的软件界面上,设置了弹出页面,控诉是恶毒前妻逼死了自己. 生命戛然而止,留给亲人痛苦,留给世人震惊. ...

  3. 【测试代码执行时间】console.time + console.timeEnd 打印输出耗时

    // 计时开始,内部文字为计时ID,开始要和结束保持一致 console.time('计时器1') // 需要测试执行时间的代码 for (let index = 0; index < 1000 ...

  4. 前端知识体系:JavaScript基础-原型和原型链-理解JavaScript的执行上下文栈,可以应用堆栈信息快速定位问题

    理解JavaScript的执行上下文栈,可以应用堆栈信息快速定位问题(原文文档) 1.什么是执行上下文: 简而言之,执行上下文就是当前JavaScript代码被解析和执行时所在环境的抽象概念,Java ...

  5. C#新增按钮

    代码亲测可用,似乎不需要“ADD”,如下:form_load段:for (int i = 0; i < 10; i++){btn = new Button();btn.Parent = this ...

  6. PHP处理base64编码字符串

    接收前端传过来的base64编码后的字符串, 如果是json字符串, 那么PHP使用file_get_contents('php://input'); 来接收. 本次这里是以post传参的形式传bas ...

  7. Appium Inspector

    点击放大镜,打开如下页面: 需要填写的信息如下: 获取以上信息,需执行aapt命令,查看app信息: 进入appt.exe所在路径,执行如下命令: 得到app的详细信息: 填写完如下信息后,保存: i ...

  8. 单调栈求全1(或全0)子矩阵的个数 洛谷P5300与或和 P3400仓鼠窝

    爆零好爽,被中学生虐好爽,还好我毕业得早 求全1(或全0)子矩阵的个数,看了题解有好几种思路,我学了三种,但有两种不是很理解,而且也没另外那个跑得快,所以简单讲述一一下我会的那种来自Caro23333 ...

  9. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...

  10. typedef struct和指针

    在学习链表时遇到了typedef已经用typedef定义的指针,不是很懂,某浪里有位博主的博文写的很详细,我直接粘过来 假设我们定义一个结构体: typedef struct ANSWER_HEADE ...