python并发编程(三):IO多路复用

'''
IO模型:
1. 上层IO操作的过程: 内核态等待数据(wait_data) + 内核态将数据拷贝给用户态程序(copy_data)
2. 同步阻塞: wait_data(block) + copy_data(block)
1) 定义:
即用户态向内核态请求数据,
若没有, 该线程(进程)直接就被挂起了(也就是当前程序阻塞了),
直到数据来了该线程才被激活就绪

2) 解决方法:
#1. mulit-threading --> 费资源
#2. pool --> 池子大小设计

3) 常见的同步阻塞:
#1. socket + TCP: s.accept()/connect_ex(), conn.recv()/conn.send()
#2. socket + UDP: s.recvfrom()
#3. 文件: read()/write()
''' # IO模型: 同步阻塞

'''
同步非阻塞: wait_data(unblock, 轮询) + copy_data(block)
1) 定义:
即用户态向内核请求数据,
若没有, 向该线程(进程)返回error; 该线程可在下次询问之前做其他的事
若有, 则向该线程用户态拷贝数据(block)

2) 使用:
#1. server.setblocking(False) # 声明为非阻塞型服务器

#2. wait_data不到:
server.accept()
conn.recv()
conn.send()
raise BlockingIOError:
期间可做其他事情

#3. 定义几个数据集用以处理请求:
req_list: 当有请求接入, 存入
del_list: 将无数据传入的连接存入, 之后把所有废弃请求从req_list中删除
w_dict: 将有数据传入的连接存入, 之后统一处理
''' # IO模型: 同步非阻塞

'''
同步IO复用: select[conn1,conn2,...](block) + [conn_i]copy_data(block)
1) 定义:
利用select同时检测多个non-blocking连接, 哪个wait_data(ok)就让其copy_data

2) 特点:
#1. 相当于还是两次block(select + copy_data), 而且还有两次系统调用(select + recv)
#2. 适用于大规模连接的情况, 小规模还是mulit-threading + blocking IO

3) select原理:
#1. select采用无差别轮询的方法
#2. 通过水平触发的方式(只有内核态有数据就会触发)
#3. 检测其用户态文件描述符(fd)的变化, 从而找到其对应内核态的数据
#4. 允许其copy_data到用户态
#5. 时间复杂度为O(n)

4) poll:
相比select取消了文件描述符的数量限制, select1024

5) epoll:
#1. 相比select采用边缘触发方式检测, 即当内核态数据发生变化(/)才会触发检测
#2. 采用问答式检测, 无需轮询

* select使用:
# 初始化
r_list = [server, ]
w_list = []
e_list = []

# select检测
r_able, w_able, e_able = select.select(r_list, w_list, e_list,[timeout])
r_able: 检测到的可读连接list
w_able: 检测到的可写连接list
e_able: 检测到的发生异常的连接list
timeout: select

转载于:https://www.cnblogs.com/lancelotxly/p/10843617.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值