什么是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只支持水平触发
水平触发:
每隔一段时间都访问一次应用层,通知事件就绪,不阻塞
边缘触发:
一次没有处理后继续阻塞,当有新的事件就绪后,一起返回