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. HyperLogLog算法

    项目在统计UV/PV时用到了Druid的Hyper hyperunique算法,书上介绍这种算法求出的UV/PV存在一定误差,因此需要了解下误差来自哪里. 实现去重功能,最简单的就是使用set记录集合 ...

  2. Mesh内存分配器的mmap小技巧

    最近看了一篇内存分配器的论文,原理很简单,但是里面的数学论证还没看懂,这次先简单写一下原理和用到的API. 内存分配器是用于封装操作系统提供的底层API,给应用程序提供动态内存的.内存不断申请释放后, ...

  3. JavaScript中为什么使用立即执行函数来封装模块?

    最近在学习JavaScript基础,在学习到面向对象编程时,学习到在JavaScript中实现模块化的方法,其中一个重要的点是如何封装私有变量. 实现封装私有变量的方法主要是: 使用构造函数 func ...

  4. [LeetCode&Python] Problem 415. Add Strings

    Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2 ...

  5. Hadoop_CDH安装

    ——本文非个人原创,为大牛同事整理,发布于此以备忘 1     CDH5.8安装(2018年4月19日) 1.1   物理服务器注意事项 (1)把raid都去掉了,每个物理盘都用raid0创建一个虚拟 ...

  6. Arcgis API for JS——普通分屏联动及二三维联动

    对于二三维联动,有多种方法进行实现,当时旧项目使用了当时能掌握的一种写法,在技能提升了这么多后当然要对这些写法做一个总结. 一.通过监听View上的鼠标事件变化来进行分屏联动(同一坐标系) (同理可以 ...

  7. django_视图层_便捷工具

    便捷工具 render(request, template_name, context=None, content_type=None, status=None, using=None) 将给定的模板 ...

  8. 同时使用多个JDK版本的方法

    开发环境需要使用JDK1.8,但是有些系统仅支持JDK1.6,以下方法可满足此需求: 1.使用安装包安装JDK1.6,安装之后记得设置不自动更新,控制面板-JAVA:        2.使用免安装版J ...

  9. day09 小练习 斐波那契数列 文件

    #2.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素, # 并将其作为新列表返回. # def get_odd_list(info): # ul=info[1::2] # return ...

  10. What is the Annotation?

    Annotation称为注释或注解,它是一个接口.注解提供了一种为程序元素(类.方法.成员变量等)设置元数据(描述其它数据的数据)的方法.编译器.开发工具或其它程序中可以通过反射来获取程序中的Anno ...