标签:客户端 响应 检测 状态 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