标签:客户端 响应 检测 状态 recv window 一起 false 目录
参考博客:https://www.cnblogs.com/linhaifeng/articles/7454717.html
# 阻塞IO		blocking IO           
# 非阻塞IO		nonblocking IO      
# 多路复用IO	IO multiplexing      
# 信号驱动IO	signal driven IO     
# 异步IO		asynchronous IO    
由signal driven IO(信号驱动IO)在实际中并不常用,所以主要介绍其余四种IO Model。
# IO操作时,两个对象之间存在两个行为阶段(两个阻塞阶段):
- 等待数据 wait data (Waiting for the data to be ready)
- 拷贝数据 copy data (Copying the data from the kernel to the process)
1、被动等待接受:read、readv、recv、recvfrom、recvmsg、accept
2、主动发送数据:write、writev、send、sendto、sendmsg、connect
# 网络IO主要表现在 accept、recv、recvfrom
# 被动等待数据的时间一般很长,这就是IO操作遇到阻塞的主要原因。
# 不论是收数据还是发送数据,都是直接跟自己的操作系统打交道,问自己的OS要数据或将数据交给OS发出去。
# 因此被动等数据的时间很长,主动发数据就很容易,因此可以不考虑send这种网络IO(忽略不计)。
默认所有IO都是阻塞IO。
wait data 和copy data两个阻塞阶段,等待时间最长。
可以将socket设置为非阻塞模式,此时accept和recv就不会再原地等待了。
server.setblocking(False)	# 默认是True, 为阻塞IO
wait data 阶段,应用程序可以干点别的事情,不会傻傻的原地等待,只是时不时地询问一下数据是否来到(轮询);数据到了后再经历 copy data 阻塞阶段获取数据。此时,只经历了copy data阻塞阶段。wait copy阶段的阻塞时间。
多路复用IO,是将轮询的任务单独拎出来,交给一个‘中介‘监管。应用程序只要向这个‘中介‘询问一次,‘中介‘就帮你等待,等数据到了再通知你过来取数据。相当于你向中介找房子,中介帮你等房源;等房源到了之后再通知你去看房。
import select
r_list = [server]	# 将待监管的对象放在一起,交给select帮我们监管起来,后面的conn对象再放进去
readable_list, *_ = select.select(read_list, [], [])
wait data阻塞阶段,也不一直占用CPU资源(‘中介‘帮忙等数据)。copy data阻塞阶段。wait data 阻塞阶段,但整个进程或线程是被select阻塞的。
# 监管机制其实有很多
select机制  windows linux都有
poll机制    只在linux有   poll和select都可以监管多个对象 但是poll监管的数量更多
上述select和poll机制其实都不是很完美 当监管的对象特别多的时候,可能会出现 极其大的延时响应
epoll机制   只在linux有
	它给每一个监管对象都绑定一个回调机制
	一旦有响应 回调机制立刻发起提醒
针对不同的操作系统还需要考虑不同检测机制 书写代码太多繁琐
有一个人能够根据你跑的平台的不同自动帮你选择对应的监管机制
# selectors模块
异步IO通过异步提交任务 + 回调机制的方式降低阻塞等待时间。
copy data阻塞阶段。wait data 和 copy data 两个阻塞阶段。
# 相关的模块和框架
- 模块:asyncio模块
- 异步框架:sanic tronado twisted

标签:客户端 响应 检测 状态 recv window 一起 false 目录
原文地址:https://www.cnblogs.com/Kathrine/p/12796885.html