之前学到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模型相关推荐

  1. python - IO模型

    阅读目录 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchro ...

  2. python学习笔记(IO模型)

    1.IO模型介绍: io模型一般有五种: * blocking IO          * nonblocking IO          * IO multiplexing          * s ...

  3. python基础27 -----python进程终结篇-----IO模型

    一.IO模型 1.IO模型分类 1.阻塞IO--------blocking IO 2.非阻塞IO------nonblocking IO 3. 多路复用IO------- multiplexing ...

  4. python 模拟io_Python 的五种io模型理解

    一 IO操作本质 数据复制的过程中不会消耗CPU 1 2 3 #1 内存分为内核缓冲区和用户缓冲区 # 2 用户的应用程序不能直接操作内核缓冲区,需要将数据从内核拷贝到用户才能使用 # 3 而IO操作 ...

  5. python 网络编程 异步io_python网络编程——网络IO模型

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  6. python学习模型_python学习笔记(IO模型)

    1.IO模型介绍: io模型一般有五种: * blocking IO * nonblocking IO * IO multiplexing * signal driven IO * asynchron ...

  7. python(40)- 进程、线程、协程及IO模型

    一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...

  8. Python之IO模型

    IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞 ...

  9. python事件触发机制_Python3-事件驱动、IO模型和触发方式

    事件驱动模型 传统编程线性模型 开始 ----> 代码块A ---->代码块B ---->代码块C ...... 结束 每个代码块都有各自实现的功能,按照条件语句顺序判断执行,每一次 ...

  10. python编辑程序模型_python并发编程之IO模型

    了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...

最新文章

  1. .net中如何同步获取数据方式增加一样数据自动刷新列表_期待已久的动态数据库工具终于来了!...
  2. 神色洋溢的 域名背后的故事
  3. python - 字符串的格式化输出
  4. 64位windows与32位windows的区别
  5. 截取字符串slice(),substring() ,substr()。
  6. [Xcode 实际操作]七、文件与数据-(3)创建文本文件、属性列表文件、图片文件
  7. 时光机穿梭---管理修改
  8. 阻尼衰减曲线用python_高阻尼隔震橡胶支座结构及防震效果
  9. ARM汇编中lr(r14)寄存器的作用
  10. shell 脚本和 bash 脚本的关系
  11. corosycnpacemaker的高可用web集群
  12. _cdecl与_stdcall的区别
  13. 面试官到底想看什么样的简历?
  14. 百度地图如何获取国内行政区的边界,同时添加覆盖物并且填充颜色
  15. pk188 安装方法 最新微信陌陌站街神器 uber 平安易贷
  16. xp 无法关闭计算机,电脑xp系统关不了机,一直显示在正在关机为什么 除了重装,还能怎么办...
  17. PAT 1044 火星数字
  18. 简单三招,设计复杂ERP报表
  19. python pip install fitter 失败解决方案
  20. java编程个人总结_java个人总结

热门文章

  1. 计算机网络基础系列(七)复用、分用和可靠数据传输的基本原理
  2. CentOS 7.4 上如何安装 tomcat 9
  3. 2018.1.30-31 开始racket,避免mutation,lazy evaluation
  4. matconvnet在MATLAB2013配置过程中遇到的问题
  5. 双足机器人的平衡控制
  6. oracle的安装与卸载
  7. MSCHART控件中长字符的X轴坐标标注全部显示
  8. Vue.js学习笔记(一) - 起步
  9. spring注解方式配置以及spring4的泛型注入 (4)
  10. Python图片与其矩阵数据互相转换