第二十二篇、IO多路复用 一
一、简介io多路复用
可以监听多个文件描述符(socket对象)(文件句柄),一旦文件句柄出现变化,就会感知到
Linux中的 select,poll,epoll(内核2.6以上) 都是IO多路复用的机制
windows 只支持select
select性能比较低,并且对文件描述符个数有限制,最多监控1024个
之后就有了poll,poll相当于对select的优化,对于文件描述符的个数已经没有了限制,但是底层循环都是for循环(被动)
epoll革新了io多路复用,底层不是用for循环,而是用的异步,要每个句柄谁发发生了变化就告诉epoll,内部实现机制(主动)
nginx就是socket+epoll来实现的
注意:网络操作、文件操作、终端操作等均属于IO操作,对于windows只支持Socket操作,其他系统支持其他IO操作,但是无法检测 普通文件操作 自动上次读取是否已经变化。
Windows Python:
提供: selectMac Python: 提供: selectLinux Python: 提供: select、poll、epoll二、首先问一个问题,如何让socketserver端实现监听多个端口?
监听一个端口代码:
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",993))
sk.listen()
while True:
conn,addre = sk.accept()
while True:
conn_bytys = conn.recv(1024)
conn_str = str(conn_bytys,encoding="utf-8")
conn.sendall(bytes(conn_str + "好",encoding="utf-8"))
conn.close()
监听多个端口的server端:
import socket
sk = socket.socket()
sk.bind(("127.0.0.1",993))
sk.listen() sk1 = socket.socket()
sk1.bind(("127.0.0.1",991))
sk1.listen() sk2 = socket.socket()
sk2.bind(("127.0.0.1",992))
sk2.listen() impute = [sk,sk1,sk2,]
import select
while True:
#[sk,sk1,]select内部自动监听 sk1,sk,sk2对象,一旦某个句柄发生变化,就会执行for循环
#最后的1,表示最大等待时间数
#r_list表示impute列表
#里面参数,第一个是监听内部变化,把变化的交给r_list,第三个参数是监听发生错误,如果发生错误,就会去第一个参数里面查找谁出错了,然后摘走放到e_list里面,第二个参数只要有值就会传递个w_list
#上面的就是select的作用io多路复用之一
r_list,w_list,e_list = select.select(impute,[],[],1)
for s in r_list:
#每一个连接对象
conn,addre = s.accept()
conn.sendall(bytes("hello",encoding="utf-8"))
conn.close()
# 下面这个就是第三个参数的应用,即使出错程序也可以继续执行
for s in e_list:
impute.remove(sk)
上面代码总结:
#1、[sk,sk1,]select内部自动监听 sk1,sk,sk2对象,一旦某个句柄发生变化,就会执行for循环
2、最后的1,表示最大等待时间数
3、r_list表示impute列表
4、里面参数,第一个是监听内部变化,把变化的交给r_list
5、第三个参数是监听发生错误,如果发生错误,就会去第一个参数里面查找谁出错了,然后摘走放到e_list里面
6、第二个参数只要有值就会传递个w_list
上面的就是select的作用io多路复用之一
三、select方法:
句柄列表11, 句柄列表22, 句柄列表33 = select.select(句柄序列1, 句柄序列2, 句柄序列3, 超时时间) 参数: 可接受四个参数(前三个必须)
返回值:三个列表 select方法用来监视文件句柄,如果句柄发生变化,则获取该句柄。
1、当 参数1 序列中的句柄发生可读时(accetp和read),则获取发生变化的句柄并添加到 返回值1 序列中
2、当 参数2 序列中含有句柄时,则将该序列中所有的句柄添加到 返回值2 序列中
3、当 参数3 序列中的句柄发生错误时,则将该发生错误的句柄添加到 返回值3 序列中
4、当 超时时间 未设置,则select会一直阻塞,直到监听的句柄发生变化
当 超时时间 = 1时,那么如果监听的句柄均无任何变化,则select会阻塞 1 秒,之后返回三个空列表,如果监听的句柄有变化,则直接执行。
第二十二篇、IO多路复用 一的更多相关文章
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- Python之路【第二十二篇】CMDB项目
浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...
- SpringBoot非官方教程 | 第二十二篇: 创建含有多module的springboot工程
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springbot22-modules/ 本文出自方志朋的博客 这篇文 ...
- Python之路【第二十二篇】:Django之Model操作
Django之Model操作 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...
- Python之路(第二十二篇) 面向对象初级:概念、类属性
一.面向对象概念 1. "面向对象(OOP)"是什么? 简单点说,“面向对象”是一种编程范式,而编程范式是按照不同的编程特点总结出来的编程方式.俗话说,条条大路通罗马,也就说我们使 ...
- flask第二十二篇——模板【4】过滤器
请关注微信公众号:自动化测试实战 先来教大家一个pycharm设置默认模板的方法.我们每次新建模板或者平时写代码打开以后可能都要重复写# coding: utf-8这些代码,其实我们可以设置好模板,让 ...
- 【Python之路】第二十二篇--Django【基础篇】
1 Django流程介绍 MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业 ...
- 第二十二篇 正在表达式 re模块
re模块****** 就本质而言,正则表达式时一种小型的,高度专业化的编程语言,在python里,它内嵌在python中,并通过re模块实现.正则表达式模式被编译成一系列的字节码.然后用C编写的匹配引 ...
- 第二十二篇:C++中的多态机制
前言 封装性,继承性,多态性是面向对象语言的三大特性.其中封装,继承好理解,而多态的概念让许多初学者感到困惑.本文将讲述C++中多态的概念以及多态的实现机制. 什么是多态? 多态就是多种形态,就是许多 ...
随机推荐
- IQueryable和IEnumerable以及AsEnumerable()和ToList()的区别
注意:本文背景为 Linq to sql .文中ie指代IEnumerable,iq指代IQueryable. IQueryable 和 IEnumerable 的区别 IQueryable 延时执行 ...
- HTML5 2D平台游戏开发#6地图绘制
此前已经完成了一部分角色的动作,现在还缺少可以交互的地图让游戏看起来能玩.不过在开始之前应当考虑清楚使用什么类型的地图,就2D平台游戏来说,一般有两种类型的地图,Tile-based和Art-base ...
- 【数据挖掘】聚类之k-means(转载)
[数据挖掘]聚类之k-means 1.算法简述 分类是指分类器(classifier)根据已标注类别的训练集,通过训练可以对未知类别的样本进行分类.分类被称为监督学习(supervised learn ...
- HDFS源码分析数据块校验之DataBlockScanner
DataBlockScanner是运行在数据节点DataNode上的一个后台线程.它为所有的块池管理块扫描.针对每个块池,一个BlockPoolSliceScanner对象将会被创建,其运行在一个单独 ...
- LCD屏背光驱动调试心得---血的教训
开发板:明远智睿MY-IMX6-EK140 内核源码:linux-3.14.52 背光驱动IC:MP3202 调光原理:通过开发板的核心板PWM4引脚控制MP3202的EN脚,输出不同的占空比从而达到 ...
- XtraBackup备份mysql5.1.73
一.基础介绍 mysql5.1在源码中配备了两个版本的innodb存储引擎源码:innobase和innodb_plugin,编译安装的时候可以通过参数--with-plugins=innobase, ...
- JAVA读文件和写文件的的代码模版
有的时候经常为真么读写文件最合理发愁,因为JAVA提过读写文件的方式太多了(C更甚至,fopen & open又有多少人傻傻分不去,更别说ReadFile了). 这里个人绝对比较好的写法,仅供 ...
- 使用 SourceTree 遇到冲突的解决方法
首先,更新代码之前先 git stash ,然后 git pull ,再 git stash pop 这时候如果本地改的代码跟线上的冲突了,就报错了.那么就需要手动解决冲突. 打开存在冲突的文件,会看 ...
- 再遇xdebug坑
xdebug.remote_handler=dbgp xdebug.idekey=PHPSTORM ;开启远程调试 xdebug.remote_enable = On ;远程主机 xdebug.rem ...
- 单向HASH——MurmurHash
//seed 是大质数unsigned long long MurmurHash64B ( const void * key, int len, unsigned int seed ) { const ...