python中IO多路复用总结
IO多路复用中包括 select、pool、epoll,这些都是阻塞IO
1. select
- 功能:
- 监控(关注)多个IO,
- 如果某个IO处于就绪状态
- 则立即返回、通知应用程序
- 实现
rlist = [fd,] #关注读事件IO列表
wlist = [fd,] #关注写事件IO列表
xlist = [fd,] #关注异常事件IO列表
timeout #超时事件,可选
rs,ws,xs=select(rlist,wlist,xlist[,timeout]) #阻塞等待事件发生,一般用循环来处理多个事件
print("监控到有IO事件发生")
#遍历rs,ws,xs ,处理事件
2. poll
- poll和select原理一样,监控多个IO的状态,并返回给应用程序
- 实现
事件:[eventmask]
POLLIN 表示IO的读事件
POLLOUT 表示IO的写事件
POLLERR 表示IO的异常事件
POLLHUP 表示IO被断开
POLLNVAL 无效请求
p = poll() # 创建poll对象
p.register(fd, [eventmask]) # 关注io
unregister(fd) #取消关注
events = p.poll() #阻塞,等待IO事件,一般用循环来处理多个事件
#events:文件描述符,就绪事件,遍历处理事件
3. epoll
- 是poll的改进版,针对数量较多的IO情况
性能更好 - 在获取事件时候,不需要遍历所有被监控的IO
只需遍历产生了事件被唤醒的那部分 - 提供了更丰富的触发机制
1. 水平触发:当IO上有事件的时候,epoll会发出事件通知,如果IO上没有进行操作下次调用epoll时候还会进行通知
2. 边缘触发:当IO上有事件发生时,只通知一次就算是IO事件没有被处理,直到再次出现事件的时候才通知 - 使用:poll对象的函数改成epoll即可