IO多路复用(Python)
1. select:
监听多个文件描述符(当文件描述符条件不满足时,select会阻塞),当某个文件描述符状态改变后,将该文件描述符添加到对应返回的列表
调用:
fd_r_list, fd_w_list, fd_e_list = select.select(rlist, wlist, elist, [timeout])
参数:三个序列、一个超时时间
- rlist: wait until ready for reading
- wlist: wait until ready for writing
- elist: wait for an “exceptional condition”
- timeout: 超时时间,超时时间为空,则select会一直阻塞,直到监听的句柄发生变化
返回值:三个列表
- 当rlist序列中的fd满足“可读”条件时,则获取发生变化的fd并添加到fd_r_list中
- 当wlist序列中含有fd时,则将该序列中所有的fd添加到 fd_w_list中
- 当elist序列中的fd发生错误时,则将该发生错误的fd添加到 fd_e_list中
缺点:
- 事件循环中只要select监听的满足条件的fd状态发生改变,就会调用select函数,此过程需要将监听的所有fd从用户态拷贝到内核态,随监听的fd数量增加开销增大
- select只能知道有fd变化,却不知道具体是谁,所以需要遍历所有fd,当fd数量很大时,开销增大
- select可监听的fd最大数量有限制(1024)
优点:
跨平台(windows、unix、linux都能用)
2. poll(过渡):
优点:
解决了select监听最大数量限制的问题
3. epoll:
优点:
解决大量并发连接中少量活跃情况下系统CPU利用率问题(
- epoll_create创建epoll句柄
- epoll_ctl注册/删除待监听事件
- epoll_wait等待事件产生
)
- epoll_ctl每次注册新的事件到epoll句柄中时,会把所有的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝,保证了每个fd在整个过程中只会拷贝一次
- epoll_ctl遍历fd,为每个fd指定回调函数,客户端就绪,唤醒等待队列的等待者,调用回调函数把就绪的fd加到就绪链表,epoll_wait直接遍历就绪链表查看就绪的fd
- 没有最大监听数量限制
*水平触发、边缘触发
水平触发:电信号为0或1时触发;即只要满足某个条件就触发(监听的fd有可读写事件发生,但未读写完,下次还会通知)--select、epoll
边缘触发:电信号由0变为1时触发(或1变为0);即状态变化时触发(监听的fd有可读写事件发生,但未读写完,下次不会通知,除非再有新的读写状态变化时触发)--epoll
IO多路复用(Python)的更多相关文章
- python网络编程——IO多路复用之select
1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...
- 【python】-- IO多路复用(select、poll、epoll)介绍及实现
IO多路复用(select.poll.epoll)介绍及select.epoll的实现 IO多路复用中包括 select.pool.epoll,这些都属于同步,还不属于异步 一.IO多路复用介绍 1. ...
- 39 - 同步-异步-IO多路复用
目录 1 同步与异步 2 阻塞与非阻塞 3 什么是IO 3.1 内核态用户态 3.2 IO两个阶段 3.3 IO模型 3.3.1 同步阻塞IO 3.3.2 同步非阻塞IO 3.3.3 IO多路复用 3 ...
- IO多路复用(select、poll、epoll)介绍及select、epoll的实现
IO多路复用(select.poll.epoll)介绍及select.epoll的实现 IO多路复用中包括 select.pool.epoll,这些都属于同步,还不属于异步 一.IO多路复用介绍 1. ...
- Python(七)Socket编程、IO多路复用、SocketServer
本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" ...
- python中的IO多路复用
在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...
- socket_server源码剖析、python作用域、IO多路复用
本节内容: 课前准备知识: 函数嵌套函数的使用方法: 我们在使用函数嵌套函数的时候,是学习装饰器的时候,出现过,由一个函数返回值是一个函数体情况. 我们在使用函数嵌套函数的时候,最好也这么写. def ...
- python之IO多路复用
在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- python运维开发(十)----IO多路复用线程基本使用
内容目录: python作用域 python2.7和python3.5的多继承区别 IO多路复用 socketserver模块源分析 多线程.进程.协程 python作用域 python中无块级作用 ...
随机推荐
- HyperLogLog算法
项目在统计UV/PV时用到了Druid的Hyper hyperunique算法,书上介绍这种算法求出的UV/PV存在一定误差,因此需要了解下误差来自哪里. 实现去重功能,最简单的就是使用set记录集合 ...
- Mesh内存分配器的mmap小技巧
最近看了一篇内存分配器的论文,原理很简单,但是里面的数学论证还没看懂,这次先简单写一下原理和用到的API. 内存分配器是用于封装操作系统提供的底层API,给应用程序提供动态内存的.内存不断申请释放后, ...
- JavaScript中为什么使用立即执行函数来封装模块?
最近在学习JavaScript基础,在学习到面向对象编程时,学习到在JavaScript中实现模块化的方法,其中一个重要的点是如何封装私有变量. 实现封装私有变量的方法主要是: 使用构造函数 func ...
- [LeetCode&Python] Problem 415. Add Strings
Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2 ...
- Hadoop_CDH安装
——本文非个人原创,为大牛同事整理,发布于此以备忘 1 CDH5.8安装(2018年4月19日) 1.1 物理服务器注意事项 (1)把raid都去掉了,每个物理盘都用raid0创建一个虚拟 ...
- Arcgis API for JS——普通分屏联动及二三维联动
对于二三维联动,有多种方法进行实现,当时旧项目使用了当时能掌握的一种写法,在技能提升了这么多后当然要对这些写法做一个总结. 一.通过监听View上的鼠标事件变化来进行分屏联动(同一坐标系) (同理可以 ...
- django_视图层_便捷工具
便捷工具 render(request, template_name, context=None, content_type=None, status=None, using=None) 将给定的模板 ...
- 同时使用多个JDK版本的方法
开发环境需要使用JDK1.8,但是有些系统仅支持JDK1.6,以下方法可满足此需求: 1.使用安装包安装JDK1.6,安装之后记得设置不自动更新,控制面板-JAVA: 2.使用免安装版J ...
- day09 小练习 斐波那契数列 文件
#2.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素, # 并将其作为新列表返回. # def get_odd_list(info): # ul=info[1::2] # return ...
- What is the Annotation?
Annotation称为注释或注解,它是一个接口.注解提供了一种为程序元素(类.方法.成员变量等)设置元数据(描述其它数据的数据)的方法.编译器.开发工具或其它程序中可以通过反射来获取程序中的Anno ...