位置: 编程技术 - 正文

深入理解python中的select模块(深入浅出python)

编辑:rootadmin

推荐整理分享深入理解python中的select模块(深入浅出python),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:如何理解python语言,怎么理解python,深入理解python特性pdf百度云,如何理解python语言,如何理解python语言,python的理解,python深入浅出,深入理解python特性 pdf,内容如对您有帮助,希望把文章链接给更多的朋友!

简介

Python中的select模块专注于I/O多路复用,提供了select poll epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue方法(freeBSD系统)

select方法

进程指定内核监听哪些文件描述符(最多监听个fd)的哪些事件,当没有文件描述符事件发生时,进程被阻塞;当一个或者多个文件描述符事件发生时,进程被唤醒。

当我们调用select()时:

  1、上下文切换转换为内核态

  2、将fd从用户空间复制到内核空间

  3、内核遍历所有fd,查看其对应事件是否发生

  4、如果没发生,将进程阻塞,当设备驱动产生中断或者timeout时间后,将进程唤醒,再次进行遍历

  5、返回遍历后的fd

  6、将fd从内核空间复制到用户空间

fd:file descriptor 文件描述符

参数: 可接受四个参数(前三个必须)

rlist: wait until ready for reading wlist: wait until ready for writing xlist: wait for an “exceptional condition” timeout: 超时时间

返回值:三个列表

select方法用来监视文件描述符(当文件描述符条件不满足时,select会阻塞),当某个文件描述符状态改变后,会返回三个列表

1、当参数1 序列中的fd满足“可读”条件时,则获取发生变化的fd并添加到fd_r_list中

2、当参数2 序列中含有fd时,则将该序列中所有的fd添加到 fd_w_list中

深入理解python中的select模块(深入浅出python)

3、当参数3 序列中的fd发生错误时,则将该发生错误的fd添加到 fd_e_list中

4、当超时时间为空,则select会一直阻塞,直到监听的句柄发生变化

当超时时间 = n(正整数)时,那么如果监听的句柄均无任何变化,则select会阻塞n秒,之后返回三个空列表,如果监听的句柄有变化,则直接执行。

实例:利用select实现一个可并发的服务端

在服务端我们可以看到,我们需要不停的调用select, 这就意味着:

  1 当文件描述符过多时,文件描述符在用户空间与内核空间进行copy会很费时

  2 当文件描述符过多时,内核对文件描述符的遍历也很浪费时间

  3 select最大仅仅支持个文件描述符

poll与select相差不大,本文不作介绍

epoll方法:

epoll很好的改进了select:

  1、epoll的解决方案在epoll_ctl函数中。每次注册新的事件到epoll句柄中时,会把所有的fd拷贝进内核,而不是在epoll_wait的时候重复拷贝。epoll保证了每个fd在整个过程中只会拷贝一次。

  2、epoll会在epoll_ctl时把指定的fd遍历一遍(这一遍必不可少)并为每个fd指定一个回调函数,当设备就绪,唤醒等待队列上的等待者时,就会调用这个回调函数,而这个回调函数会把就绪的fd加入一个就绪链表。epoll_wait的工作实际上就是在这个就绪链表中查看有没有就绪的fd

  3、epoll对文件描述符没有额外限制

事件:

水平触发和边缘触发:

Level_triggered(水平触发,有时也称条件触发):当被监控的文件描述符上有可读写事件发生时,epoll.poll()会通知处理程序去读写。如果这次没有把数据一次性全部读写完(如读写缓冲区太小),那么下次调用 epoll.poll()时,它还会通知你在上没读写完的文件描述符上继续读写,当然如果你一直不去读写,它会一直通知你!!!如果系统中有大量你不需要读写的就绪文件描述符,而它们每次都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率!!! 优点很明显:稳定可靠

Edge_triggered(边缘触发,有时也称状态触发):当被监控的文件描述符上有可读写事件发生时,epoll.poll()会通知处理程序去读写。如果这次没有把数据全部读写完(如读写缓冲区太小),那么下次调用epoll.poll()时,它不会通知你,也就是它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你!!!这种模式比水平触发效率高,系统不会充斥大量你不关心的就绪文件描述符!!!缺点:某些条件下不可靠

epoll实例:

总结

标签: 深入浅出python

本文链接地址:https://www.jiuchutong.com/biancheng/375546.html 转载请保留说明!

上一篇:Python3如何解决字符编码问题详解(python3m)

下一篇:批量获取及验证HTTP代理的Python脚本(批量数据验证)

  • 注销空白缴销发票流程
  • 市政道路工程建筑包括什么
  • 企业持股分红
  • 小规模纳税人的起征点是多少
  • 银行进账单票据号码在哪里
  • 小规模纳税人残保金
  • 邯郸银行公对公转账时间
  • 企业年金个人所得税最新规定
  • 应交税费应交增值税的三级科目有哪些
  • 跨年冲减费用
  • 去年暂估的成本,汇算前收到的少,红冲全部暂估吗
  • 购置股权账务处理流程
  • 专票抵扣是税额吗
  • 小规模季度销售超过30万怎么纳税
  • 一般纳税人有按季申报的吗
  • 按次申报是什么意思
  • 单位固定资产出售账务处理
  • 计提工资怎么做账务处理
  • 汇算清缴退税调整利润表
  • 收不回工程款的心情
  • 进厂的政府补贴怎么拿
  • 房地产行业需要做环评吗
  • 公司罚款怎么写
  • 预收账款是
  • 电脑重装系统启动
  • mac键盘图标与对号不一致
  • 商业一般纳税人辅导期截止时间
  • php 字符串 数组
  • 减免的税款还用做分录吗
  • 手机电脑排行
  • 公司福利放置零食文案
  • 蟹爪兰的养殖方法和浇水
  • 一般纳税人差额征税申报表怎么填
  • 增值税价外费用是什么意思
  • 进项税额转出的所有会计分录
  • php遍历结果集
  • 使用vscode开发vue例子
  • 一分钟玩转钉钉文档是什么东西
  • 增资会计
  • 代开增值税发票需要预交所得税吗
  • 社保费已扣为什么显示欠缴
  • 应付利息如何结转
  • access使用查询向导创建查询
  • 小程序集合软件
  • 织梦设置的关键词看不到
  • 所得税费用期末结转吗
  • 开普票需要公对公吗
  • 小规模纳税人给别人开票的税点多少
  • 金税四期对企业的好处
  • 4s店销售走了该找谁
  • 加计抵减期末有余额怎么办
  • 当月已付款, 没收到发票怎么做账
  • 待抵扣进项税额和待认证进项税额的区别
  • 购电脑怎么入账
  • etc发票当天可以打印吗
  • 往来是啥意思
  • 无形资产管理的特点
  • linux安装iso软件
  • virtualbox安装win7详细教程
  • os x10.11el capitan公测版下载地址(公测版计划注册教程)
  • win7网卡驱动怎么卸载
  • soundtrax.exe - soundtrax是什么进程
  • XP下HTTP的403.9错误-禁止访问:连接的用户过多 重启iis可以解决
  • randomdigits.exe - randomdigits是什么进程 有什么用
  • win7访问共享文件
  • fsav32.exe是什么进程 有什么作用 fsav32进程查询
  • apache for mac
  • centos ulimit
  • suse linux 12 sp5
  • android:ViewPager与FragmentPagerAdapter
  • unity物体移动速度怎么设置
  • 网页制作范例
  • nodejs 获取命令行参数
  • unity游戏开发常用技术
  • shell for遍历
  • javascript有几种类型
  • 安卓修改udid
  • 使用jQuery调用XML实现无刷新即时聊天
  • 郑州房管局办事大厅预约
  • 一般纳税人附加税减半征收政策
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设