Czs--从此蜕变

IO多路复用

什么是IO多路复用

同时监控多个IO事件,当哪个IO事件准备就绪就执行哪个IO事件,形成并发的效果

并发和并行的区别

并发:多个事件同时发生,产生一个同时处理的效果
并行:多个事件同时进行

多路复用之select模块

import select

select —> win,linux,uinx
poll —> linux,uinx
epoll —>linux,uinx

r,w,x=select(rlist,wlist,xlist,[timeout])
功能:监控IO事件,阻塞等待IO事件发生
参数:rlist: 列表 存放我们要监控等待处理的IO
需要满足一定的条件才能够发生的事
存储在这个列表中
wlist:列表 存放我们希望主动处理的IO
wlist中的内容会立即返回,处理
比如send发送,可以自主处理
不经常使用,容易被忽略
xlist:列表 存放如果发生异常需要我们处理的
监控异常发生的列表
timeout:数字 表示超时检测 默认一直阻塞
超过这个时间后结束阻塞

当任意一个事件准备就绪后,返回
返回值:r:列表 rlist当中准备就绪的IO
w:列表 wlist中准备就绪的IO
x:列表 xlist中准备就绪的IO

IO多路复用注意点:
1.在处理IO过程中不应该发生死循环(某个IO单独占有服务器)
2.IO多路复用是单进程程序,是一个并发程序
3.IO多路复用有较高的IO执行效率
多路复用之poll模块
1.创建poll对象
p=select.poll()    

2.加入关注的IO
p.register(s)
p.unregister(s) 从关注IO中删除

3.使用poll函数监控
events=p.poll()
功能:阻塞函数,直到任意一个监控的对象准备就绪
返回值:event[(fileno,event),(),()]
fileno:准备就绪事件的fileno
event:用来判断一个事件是否准备就绪

4.处理发生的IO事件



poll io事件
POLLIN POLLOUT POLLUP    POLLERR  POLLPRI    POLLVAL
rlist    wlist  断开连接  xlist    紧急处理   无效数据
多路复用之epoll模块

效率上比poll和select稍微高点
内核找到就绪io后直接返回,不用在应用层遍历一遍
只能用于linux,unix
支持边缘触发
select poll只支持水平触发
水平触发:
每隔一段时间都访问一次应用层,通知事件就绪,不阻塞
边缘触发:
一次没有处理后继续阻塞,当有新的事件就绪后,一起返回

🐶 您的支持将鼓励我继续创作 🐶