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中

缺点:

  1. 事件循环中只要select监听的满足条件的fd状态发生改变,就会调用select函数,此过程需要将监听的所有fd从用户态拷贝到内核态,随监听的fd数量增加开销增大
  2. select只能知道有fd变化,却不知道具体是谁,所以需要遍历所有fd,当fd数量很大时,开销增大
  3. select可监听的fd最大数量有限制(1024)

优点:

  跨平台(windows、unix、linux都能用)

2. poll(过渡):

优点:

  解决了select监听最大数量限制的问题

3. epoll:

优点:

  解决大量并发连接中少量活跃情况下系统CPU利用率问题(

  1. epoll_create创建epoll句柄
  2. epoll_ctl注册/删除待监听事件
  3. epoll_wait等待事件产生

  1. epoll_ctl每次注册新的事件到epoll句柄中时,会把所有的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝,保证了每个fd在整个过程中只会拷贝一次
  2. epoll_ctl遍历fd,为每个fd指定回调函数,客户端就绪,唤醒等待队列的等待者,调用回调函数把就绪的fd加到就绪链表,epoll_wait直接遍历就绪链表查看就绪的fd
  3. 没有最大监听数量限制

*水平触发、边缘触发

水平触发:电信号为0或1时触发;即只要满足某个条件就触发(监听的fd有可读写事件发生,但未读写完,下次还会通知)--select、epoll

边缘触发:电信号由0变为1时触发(或1变为0);即状态变化时触发(监听的fd有可读写事件发生,但未读写完,下次不会通知,除非再有新的读写状态变化时触发)--epoll

IO多路复用(Python)的更多相关文章

  1. python网络编程——IO多路复用之select

    1 IO多路复用的概念 原生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收发数据(调用recv.send.sendall)时也是阻塞的.原生so ...

  2. 【python】-- IO多路复用(select、poll、epoll)介绍及实现

    IO多路复用(select.poll.epoll)介绍及select.epoll的实现 IO多路复用中包括 select.pool.epoll,这些都属于同步,还不属于异步 一.IO多路复用介绍 1. ...

  3. 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 ...

  4. IO多路复用(select、poll、epoll)介绍及select、epoll的实现

    IO多路复用(select.poll.epoll)介绍及select.epoll的实现 IO多路复用中包括 select.pool.epoll,这些都属于同步,还不属于异步 一.IO多路复用介绍 1. ...

  5. Python(七)Socket编程、IO多路复用、SocketServer

    本章内容: Socket IO多路复用(select) SocketServer 模块(ThreadingTCPServer源码剖析) Socket socket通常也称作"套接字" ...

  6. python中的IO多路复用

    在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...

  7. socket_server源码剖析、python作用域、IO多路复用

    本节内容: 课前准备知识: 函数嵌套函数的使用方法: 我们在使用函数嵌套函数的时候,是学习装饰器的时候,出现过,由一个函数返回值是一个函数体情况. 我们在使用函数嵌套函数的时候,最好也这么写. def ...

  8. python之IO多路复用

    在python的网络编程里,socetserver是个重要的内置模块,其在内部其实就是利用了I/O多路复用.多线程和多进程技术,实现了并发通信.与多进程和多线程相比,I/O多路复用的系统开销小,系统不 ...

  9. 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

    下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...

  10. python运维开发(十)----IO多路复用线程基本使用

    内容目录: python作用域 python2.7和python3.5的多继承区别 IO多路复用 socketserver模块源分析 多线程.进程.协程 python作用域  python中无块级作用 ...

随机推荐

  1. nginx 支持ipv6设置

    为了使nginx支持ipv6 访问需要做以下配置: 1.找到nginx的安装路径: 使用命令:whereis nginx 查看nginx安装路径: 进入nginx执行文件目录: 先用./nginx - ...

  2. node.js设置跨域

    app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*& ...

  3. Spring Boot Logback日志配置

    logback的使用: Logback的默认配置 如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurat ...

  4. Mabatis面试题

    Mybatis面试题 1请写出Mybatis核心配置文件MyBatis-config.xml的内容? <?xml version="1.0" encoding="U ...

  5. 阿里云ECS Centos7 系统安装图形化桌面

    阿里云官网默认的Linux Centos7系统镜像,都是没有安装桌面环境的,用户如果要使用桌面,需要自己在服务器上进行安装. 本教程以MATE桌面安装为例 1.登录服务器,执行命令安装桌面环境. 先安 ...

  6. vue.js学习第一天,了解vue.js

    vue.js是一个前端框架,他与jquery不同,jquery是一个js库,而vue.js是js的前端框架. vue.js对我们前端页面入侵比较大,而jquery则不然.那我们还为什么要使用vue.j ...

  7. 加载Excel时,如何过滤空行空列

    巨硬为Excel提供了丰富的C#接口,基本上可以将Excel当做一个微型数据库来用,奈何前端的我们,sql也只会写两句select * from table: 目前工作中遇到了一个问题,在需要读取的E ...

  8. 【SQL】 借助游标来实现文本的分列与合并

    有时我们会遇到需要把表中个别字段拆分成多条数据或是把多条数据合并到一起的情况.一般的编程语言都有函数“split”和“join”来实现,而SQL中既没有这些函数也没有类似数组和列表这类方便保存成组数据 ...

  9. SpringMVC和Struts2区别比较

    区别1: Struts2 的核心是基于一个Filter即StrutsPreparedAndExcuteFilterSpringMvc的核心是基于一个Servlet即DispatcherServlet( ...

  10. python ctypes库3_如何传递并返回一个数组

    可以将数组指针传递给dll,但无法返回数组指针,python中没有对应的数组指针类型. 如果需要返回数组,需借助结构体. 参考ctypes官方文档: https://docs.python.org/3 ...