IO多路复用
定义 : 同时监控多个IO事件,当哪个IO事件准备就绪就执行哪个IO事件。以此形成可用同时操作多个IO的并发行为,避免一个IO阻塞,造成所有IO都无法执行。
IO准备就绪 : 是一种IO必然要发生的临界状态
IO多路复用的编程实现
1. 将IO设置为关注IO
2. 将关注IO提交给内核监测
3. 处理内核给我们反馈的准备就绪的IO
具体方案:
select ---》 windows linux unix
poll --》 linux unix
epoll --》 linux unix
import select
rs,ws,xs = select(rlist, wlist, xlist[, timeout])
功能: 监控IO事件,阻塞等待IO事件发生
参数: rlist 列表 存放我们监控等待处理的IO事件
wlist 列表 存放我们要主动操作的IO事件
xlist 列表 我们要关注出错处理的IO事件
timeout 超时时间
返回值:rs 列表 rlist中准备就绪的IO
ws 列表 wlist中准备就绪的IO
xs 列表 xlist中准备就绪的IO
注意 : 1. wlist中如果有IO事件则select立即回返回为ws
2. 在处理IO过程中不要处理一个客户端长期占有服务端使服务端无法运行到select的情况
3. IO多路复用占用计算机资源少,io效率高
位运算
整数按照二进制位进行运算
& 按位与 | 按位或 ^ 按位异或
<< 左移 >> 右移
11 1011
14 1110
& 1010 一0则0
| 1111 一1则1
^ 0101 相同为0不同为1
11 << 2 101100
14 >> 2 11
poll
1.创建poll对象
p = select.poll()
2.添加注册事件
p.register(s,POLLIN | POLLERR)
POLLIN POLLOUT POLLERR POLLHUP POLLNVAL
rlist wlist xlist 断开 无效数据
p.unregister(s) 从关注事件中移除
3. 阻塞等待IO发生
events = p.poll()
功能 : 阻塞等待IO发生
返回值 : events 是一个列表,列表中给每一个元素都是一个元组,代表一个发生的IO事件
[(fileno, event),(),()....]
就绪IO的文件描述符 具体就绪事件
* 需要通过文件描述符(fileno)找到对应的IO对象
{s.fileno() : s}
4. 处理具体的IO
epoll方法
使用方法:基本与poll方法相同
* 将生产对象 poll() 改为epoll()
* 将所有poll对象事件改为epoll对象事件
区别 :
epoll 的效率要比 poll和select 高
epoll 的事件触发方式更多
本地套接字
linux 文件
b(块设备文件) c(字符设备文件) d(目录)
-(普通文件) l(链接) s(套接字) p(管道)
作用:用于本地不同的程序间进行通信
创建流程
1.创建本地套接字
sockfd = socket(AF_UNIX,SOCK_STREAM)
2.绑定本地套接字文件
* 选定文件位置和名称
* sockfd.bind(path)
3. 监听 listen()
4. 消息收发, recv send
cookie
os.path.exists(path)
功能 : 判断一个文件是否存在
参数:目标文件
返回值 : 存在返回True 否则 False
os.remove() os.unlink()
功能 : 删除一个文件
参数 : 目标文件
想要看更多的课程请微信关注SkrEric的编程课堂