Python IO模型
之前学到gevent 遇到IO操作,自动切换
对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个阶段:
- 1 等待数据准备 (Waiting for the data to be ready)
- 2 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)
记住这两点很重要,因为这些IO Model的区别就是在两个阶段上各有不同的情况。
IO模型
- 阻塞IO
- 非阻塞IO
- IO多路复用(监听多个连接)
- 异步IO
- 驱动信号
1 阻塞IO blocking
默认的socket是阻塞的,任务是串行执行的
一个典型的读操作流程:
wait data和copy data的过程中都是在等待的,也就是阻塞的。
内核态--用户态
操作系统操作的
数据存放在内核空间(数据缓冲区),操作系统把内核空间中的数据传到用户空间
数据准备阶段
accept发起系统调用,用户态转换成内核态
等待数据wait for data、copy data from kernal to user
都是阻塞,就是全程阻塞,在没有到达用户态的时候,都是阻塞
2 非阻塞IO nonblocking
可以通过设置socket的编程unblocking,sock.setblocking(True)
sock.setblocking(False) 这个没有连接,立刻报错
会立即返回是否已经连接了
wait data 不是阻塞的
从内核态拷贝数据 copy data到用户态的时候是阻塞的
- 优点:不用等待数据 ,在发起系统调用的过程中是自己的时间
- 缺点:一直发起系统调用,拿到的数据不是实时的
3 IO多路复用 select
IO 多路复用的本质就是非阻塞IO,它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程
面试中的比较多
把等待数据的过程分成了两部分:
- select 替代看wait for data return readable代表收到数据
- recv已经获得了数据
select 可以连接多个套接字对象,
r,w,e = select.select([socket,],[],[])
socketserver是threading和select共同实现的,利用了多线程和IO多路复用
select是在监听,监听的是有变化的套机子
第一次监听的是sock对象,第二次连接的是conn
socket是一个文件描述符,fd是一个整数
select是基于IO操作,节省时间
基于IO多路复用的socket 多并发聊天
客户端select机制
import socket
import select
import timesock = socket.socket()
sock.bind(("127.0.0.1",8810))sock.listen(5)sock.setblocking(False)inputs = [sock,] # 监听的列表
while 1:r,w,e = select.select(inputs,[],[]) # 监听有变化的套接字,inputs = [socket,conn1,conn2...]for obj in r:if obj==sock: # 第一次用[socket],第二次[conn]conn,addr = obj.accept()print("conn",conn)inputs.append(conn) #else:data = obj.recv(1024)print(data.decode("utf-8"))send_data = input(">>>")obj.send(send_data.encode("utf-8"))
客户端
import socketsock = socket.socket()sock.connect(("127.0.0.1", 8810))while 1:data = input(">>>")sock.send(data.encode("utf-8"))recv_data = sock.recv(1024)print(recv_data.decode("utf-8"))
sock.close()
测试结果:
有两个通道,socket是建立连接的,conn是进行通信的管道。sock对象是不变的。
关于文件描述符(套接字对象):
- 是非零整数,不会变(fd=xxx,xxx是一个整数,filedescription)
- 收发数据的时候,对于接收端而言,数据先到内核空间,然后copy到用户空间,同时内核空间的数据清空(内核空间和数据空间都是内存中分配的)
- 发送端的时候,TCP的三次握手没有应答,数据不清空
IO多路复用总结
IO多路复用的特性:(监听多个连接)
- 全程阻塞 wait for data copy data
- 监听多个文件描述符
4 异步IO
全程无阻塞
实现起来复杂的
最后总结:
阻塞IO,进程一直等待
非阻塞IO,copy data 的过程是阻塞的
IO多路复用,全程阻塞
有阻塞的就是同步IO
(阻塞IO 、非阻塞IO(copy data),IO多路复用)没有阻塞的是异步IO
[^1]http://anjianshi.net/post/yan-jiu-bi-ji/python-blocking
[^2]http://www.cnblogs.com/yuanchenqi/articles/6755717.html
转载于:https://www.cnblogs.com/Python666/p/6835885.html
Python IO模型相关推荐
- python - IO模型
阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchro ...
- python学习笔记(IO模型)
1.IO模型介绍: io模型一般有五种: * blocking IO * nonblocking IO * IO multiplexing * s ...
- python基础27 -----python进程终结篇-----IO模型
一.IO模型 1.IO模型分类 1.阻塞IO--------blocking IO 2.非阻塞IO------nonblocking IO 3. 多路复用IO------- multiplexing ...
- python 模拟io_Python 的五种io模型理解
一 IO操作本质 数据复制的过程中不会消耗CPU 1 2 3 #1 内存分为内核缓冲区和用户缓冲区 # 2 用户的应用程序不能直接操作内核缓冲区,需要将数据从内核拷贝到用户才能使用 # 3 而IO操作 ...
- python 网络编程 异步io_python网络编程——网络IO模型
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...
- python学习模型_python学习笔记(IO模型)
1.IO模型介绍: io模型一般有五种: * blocking IO * nonblocking IO * IO multiplexing * signal driven IO * asynchron ...
- python(40)- 进程、线程、协程及IO模型
一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...
- Python之IO模型
IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞 ...
- python事件触发机制_Python3-事件驱动、IO模型和触发方式
事件驱动模型 传统编程线性模型 开始 ----> 代码块A ---->代码块B ---->代码块C ...... 结束 每个代码块都有各自实现的功能,按照条件语句顺序判断执行,每一次 ...
- python编辑程序模型_python并发编程之IO模型
了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...
最新文章
- .net中如何同步获取数据方式增加一样数据自动刷新列表_期待已久的动态数据库工具终于来了!...
- 神色洋溢的 域名背后的故事
- python - 字符串的格式化输出
- 64位windows与32位windows的区别
- 截取字符串slice(),substring() ,substr()。
- [Xcode 实际操作]七、文件与数据-(3)创建文本文件、属性列表文件、图片文件
- 时光机穿梭---管理修改
- 阻尼衰减曲线用python_高阻尼隔震橡胶支座结构及防震效果
- ARM汇编中lr(r14)寄存器的作用
- shell 脚本和 bash 脚本的关系
- corosycnpacemaker的高可用web集群
- _cdecl与_stdcall的区别
- 面试官到底想看什么样的简历?
- 百度地图如何获取国内行政区的边界,同时添加覆盖物并且填充颜色
- pk188 安装方法 最新微信陌陌站街神器 uber 平安易贷
- xp 无法关闭计算机,电脑xp系统关不了机,一直显示在正在关机为什么 除了重装,还能怎么办...
- PAT 1044 火星数字
- 简单三招,设计复杂ERP报表
- python pip install fitter 失败解决方案
- java编程个人总结_java个人总结
热门文章
- 计算机网络基础系列(七)复用、分用和可靠数据传输的基本原理
- CentOS 7.4 上如何安装 tomcat 9
- 2018.1.30-31 开始racket,避免mutation,lazy evaluation
- matconvnet在MATLAB2013配置过程中遇到的问题
- 双足机器人的平衡控制
- oracle的安装与卸载
- MSCHART控件中长字符的X轴坐标标注全部显示
- Vue.js学习笔记(一) - 起步
- spring注解方式配置以及spring4的泛型注入 (4)
- Python图片与其矩阵数据互相转换