python--->io模式详解(适合零基础)

在此感谢前辈们指导,此处是我自己的理解,部分图片和段落来源于http://www.cnblogs.com/alex3714/articles/5876749.html

http://www.cnblogs.com/Anker/p/3254269.html

如果在学习过程中遇到了问题,请咨询:2775724349(因为自己时间有限,所以可能不会常回复,但会收集每个星期大家所遇到的问题,在周六以博文形式在博客中发表)

阻塞 I/O(blocking IO)

当进程开始read想读取数据时,用recv函数从内存中取数据,但是呢,内存中的数据,没有准备好,怎么办呢,这个时候就不断地开始等待,等到数据准备好后,就会结束阻塞状态,开始拷贝数据,然后发送给用户。

一个粗略的比方:我和女票出去逛街培养感情。顺便先去餐厅吃个饭

(1)我和女友点完餐后,不知道什么时候能做好,只好坐在餐厅里面等,直到做好,然后吃完才离开。

女友本想还和我一起逛街的,但是不知道饭能什么时候做好,只好和我一起在餐厅等,而不能去逛街,直到吃完饭才能去逛街,中间等待做饭的时间浪费掉了。这就是典型的阻塞

一句话来讲;

blocking IO的特点就是在IO执行的两个阶段都被block了。

非阻塞 I/O(nonblocking IO)

当一个用户想用到数据,调用recv函数时,,发消息给内存,但是内存说:大兄弟,我还没准备好。然后返回一个error(消息)给用户,但用户的系统是个急性子,心想:老大找我要啊。你也快点吧。说完,又继续发了一个消息给内核,直到数据准备好,才结束访问

比方:

(2)我女友不甘心白白在这等,又想去逛商场,又担心饭好了。所以我们逛一会,回来询问服务员饭好了没有,来来回回好多次,饭都还没吃都快累死了啦。这就是非阻塞。需要不断的询问,是否准备好了。

I/O 多路复用( IO multiplexing)

IO multiplexing就是我们说的select,poll,epoll,有些地方也称这种IO方式为event driven IO。select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。

这个就开始变得复杂了,接下来我尽量说大白话。先上图:

为了增强大家的理解,我首先将第三种与前两种,进行对比

对于第一种和第二种阻塞 I/O(blocking IO):如果在单线程下采取这种方案,一收数据,就阻塞,一收数据就阻塞,那如果我要一下子收多个数据怎么办呢,那还不玩儿完,所以这时不能在多个socket下接收数据,即便后面继续来了数据,也得等着,因为前面卡住了

但是对于这一种,假如单线程下一下子向100个socket发送数据,然后在这100个socket来个for循环,等候他们发的数据,一个循环过后,接收到了5个数据,那么就开始拷贝数据,发送给用户,有人会想,那其他的了,就不会在意了,因为 ,我已经接收到了数据。

select,poll,epoll作用就是在不断地循环,进行筛选 。

再重复一遍select连接上100个socket句柄,然后内核就开始检测这100个句柄,哪怕有一个人接收到了数据,他就把数据返回

接下来,介绍一个更加牛B的io

异步 I/O(asynchronous IO)

异步io先调用函数发通知给内核,但是,内核说我没有数据,返回一个消息,然后用户就开始做其他的事了,等到内核把数据拷贝完,就把函数直接调用给用户,可能后来一点大家话是云里雾里的,用一个抽像的比方:

我和女票不是要出去吃饭吗,我们不出去吃了,直接在家里点外卖,等外卖来了,才开始吃饭,饭吃完了,就可以直接出去玩儿。,在这期间,我和女票爱干嘛干嘛,外卖都管不着,对用户造不成影响。

相当于内核帮我们等,但是我们不需要等。这个地方与三者的区别在于,前三者,在将数据准备好后,用户还需要read一下,read过程中,可能会卡,但是这个绝不会卡。

non-blocking IO就是blocking IO在执行recvfrom这个system call的时候,如果kernel的数据没有准备好,这时候不会block进程。但是,当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中,这个时候进程是被block了,在这段时间内,进程是被block的。

而asynchronous IO则不一样,当进程发起IO 操作之后,就直接返回再也不理睬了,直到kernel发送一个信号,告诉进程说IO完成。在这整个过程中,进程完全没有被block。

四种图片对比

好了,就是这样了。最后一种最牛B,

时间: 2024-08-01 21:37:32

python--->io模式详解(适合零基础)的相关文章

Python open()函数打开文件的模式详解

Python open函数的模式详解 在Python中使用open()函数打开文件,并返回一个文件对象,然后通过文件对象对文件进行读写操作.不同类型的文件需要采用不同的模式来打开,并且采用不同模式打开文件,我们可以进行的操作以及程序运行的结果也是不同的. 打开模式 open()函数完整的语法格式为: open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)函数定义的参数

二、设计模式总览及工厂模式详解

二.架构师内功心法之设计模式 2.架构师内功心法之设计模式 2.1.课程目标 1.通过对本章内容的学习,了解设计模式的由来. 2.介绍设计模式能帮我们解决哪些问题. 3.剖析工厂模式的历史由来及应用场景. 2.2.内容定位 不用设计模式并非不可以,但是用好设计模式能帮助我们更好地解决实际问题,设计模式最重要的 是解耦.设计模式天天都在用,但自己却无感知.我们把设计模式作为一个专题,主要是学习设计模式 是如何总结经验的,把经验为自己所用.学设计模式也是锻炼将业务需求转换技术实现的一种非常有效 的方

Spartan6系列之芯片配置模式详解

1.   配置概述 Spartan6系列FPGA通过把应用程序数据导入芯片内部存储器完成芯片的配置.Spart-6 FPGA可以自己从外部非易失性存储器导入编程数据,或者通过外界的微处理器.DSP等对其进行编程.对以上任何一种情况,都有串行配置和并行配置之分,串行配置可以减少芯片对引脚的要求,并行配置对8bit/16bit Flash或者微处理器来说更合适. 因为Xilinx的FPGA器件的配置数据存储在CMOS 配置锁存器内(CCL),因此Spartan6 FPGA器件上电后必须重新配置.Sp

Virtualization-Cpu/Memory/IO虚拟化详解

一.定义 虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率. 虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程.CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率. 二.虚拟化的类别 虚拟化的类别有很多,定义也很宽泛:无

Python之print详解

Python之print详解 http://www.jb51.net/article/55768.htm print的一些基本用法,在前面的讲述中也涉及一些,本讲是在复习的基础上,尽量再多点内容. eval() 在print干事情之前,先看看这个东东.不是没有用,因为说不定某些时候要用到. 复制代码 代码如下: >>> help(eval)      #这个是一招鲜,凡是不理解怎么用,就用这个看文档 Help on built-in function eval in module __b

ST MCU_GPIO的八种工作模式详解。

补充: N.P型的区别,就是一个为正电压启动(NMOS),一个为负电压启动(PMOS) GPIO的八种工作模式详解 浮空输入_IN_FLOATING带上拉输入_IPU带下拉输入_IPD模拟输入_AIN开漏输出_OUT_OD推挽输出_OUT_PP开漏复用输出_AF_OD推挽复用输出_AF_PP4输入 + 2 输出 + 2 复用输出,一共是8种模式,以下是八种模式的工作原理: GPIO浮空输入_IN_FLOATING模式工作原理以上截图就是浮空输入模式的原理图,图中阴影的部分在浮空输入模式下是处于不

windows上安装Anaconda和python的教程详解

一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因此,我们这里使用Python这个脚本语言来进行数字图像处理. 要使用Python,必须先安装python,一般是2.7版本以上,不管是在windows系统,还是Linux系统,安装都是非常简单的. 要使用python进行各种开发和科学计算,还需要安装对应的包.这和matlab非常相似,只是matla

java知识点分享,IO流详解!

Java知识IO流详解有人觉得IO知识不太重要,其实不然,IO的使用范围很广,最能体现IO价值的就是网络上的数据传递,尤其是进入互联网时代后,各种常见的分布式架构,都少不了IO的体现.并且很多大厂的面试题中都会体现出对IO的重视,包括衍生出来的NIO.序列化等等.因此学好IO,变成了一件很重要的事情.IO基本概念IO可以简单的理解成INPUT和OUT,代表输入输出的意思.输入就是读,输出就是写.IO可以读写硬盘.光盘.内存.键盘.网络等资源上的数据.流IO中的流就相当于现实生活中的水流一样,一打

Extjs MVC开发模式详解

Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式,开始将一个JS(Extjs)应用程序分割成Model-View-Controller三层,为JS应用程序的如何组织代码指明了方向,同时使得大规模JS代码变得更加易于重用和维护:这就是Extjs MVC开发模式的初衷. 在官方给出的MVC例子中,我们可以看到一个简单的列表编辑功能,这篇文章就围绕这个功能进