在此感谢前辈们指导,此处是我自己的理解,部分图片和段落来源于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,

转载于:https://blog.51cto.com/13348847/1979024

python---io模式详解(适合零基础)相关推荐

  1. python教程视频-有没有适合零基础小白学的python教程,视频或者书籍都可以?

    当你想要自学 python3 编程时,面临的第一个问题是:"我应该看哪些书/教程/视频?"我有一份亲自验证过的极简答案.我刚经过 python3 入门并已开始实战数据分析与爬虫,这 ...

  2. python海量数据分析师职业技能_大数据分析师技能图谱详解与零基础自学内容大全...

    全球的数据量正在以每18个月翻一倍的惊人速度增长,世界正在高速数字化,大数据堪比石油,如何掘金大数据是所有个人.企业和国家的机遇和挑战.中国是人才大国,能理解和应用大数据的创新人才更是稀缺资源.大数据 ...

  3. ucos 消息队列代码详解_用python实现 多进程队的列数据处理详解,零基础记得都收藏哦

    今天就为大家分享一篇python 多进程队列数据处理详解,具有很好的参考价值,希望对大家有所帮助.喜欢的话记得点赞转发关注不迷路哦!!! 总之了写到多进程队列数据处理问题,也就不多废话了,直接来上代码 ...

  4. 3dmax基础知识:3dmax常用功能详解,零基础小白的福音

    你收藏了那么多教程,却不知道3dmax怎么入门?掌握3dmax常用功能是3dmax入门的基础之一,今天就为您盘点了一些3dmax最常用到的功能和使用方法,快来和小编一起学习3dmax入门基础知识吧! ...

  5. HTML元素中的属性2(路径详解)—零基础自学网页制作

    相对路径与绝对路径的使用方法 在<HTML元素中的属性1-零基础自学网页制作>这一篇教程最后内容中,我们详细展示了"绝对路径"与"相对路径"在写法上 ...

  6. 大数据学习路线详解,零基础学大数据学习路线

    在大数据蓬勃发展的现今,大家都看到了大数据未来不可限量的发展前景,跟着科技发展的潮流,不断学习新的技术知识,科多大数据相信,成为人生赢家不在话下. 大数据的三个发展方向,平台搭建/优化/运维/监控.大 ...

  7. 安装python步骤-从0到1,Python安装步骤详解(附基础知识简介)!

    Python下载安装步骤 python解释器,在Linux中可以内置安装,而在windows中则需要去下载.具体步骤如下: 第一步:通过Web浏览器,访问http://www.python.org官网 ...

  8. python安装步骤-从0到1,Python安装步骤详解(附基础知识简介)!

    Python下载安装步骤 python解释器,在Linux中可以内置安装,而在windows中则需要去下载.具体步骤如下: 第一步:通过Web浏览器,访问http://www.python.org官网 ...

  9. 小白180天学习笔记详解:零基础如何学习人工智能

    人工智能是大家公认的热点和未来趋势,目前对人工智能感兴趣的学生不在少数.一方面人工智能现在已经上升到国家发展战略层面,高校和专业的人工智能培训机构为应对人才缺口,开始着手培养人工智能人才:另一方面,人 ...

最新文章

  1. Django模型之数据库操作-查询
  2. 国内知名 IT 公司前端团队
  3. linux系统安装柯美打印机,柯尼卡美能达复印机中标麒麟系统驱动安装
  4. Android免Root环境下Hook框架Legend原理分析
  5. SpringBoot整合RabbitMQ测试
  6. 如何进行 node.js 的 安装与卸载
  7. 【转】java.util.ResourceBundle使用详解
  8. 三种主流快平台技术测评,你更青睐谁?
  9. 网络编程_8(项目附件)
  10. 推荐一款java微信答题小程序源码知识竞赛问答pk头脑答题游戏
  11. 石墨烯的精细结构研究取得进展
  12. 路由器: 手把手教你小米路由器 4C 刷 OpenWrt 固件
  13. python高级索引
  14. gedit 编辑器使用教程
  15. 银联支付(chinapay)java接入避坑指南
  16. 关于轩辕剑3外传 swd3eDvd.exe报错问题
  17. 使用opencv和C++实现多焦距图像合成
  18. 梯度爆炸与梯度消失是什么?有什么影响?如何解决?
  19. UML类图的辅助构建的逻辑代码
  20. 小米路由器探测和测评本人亲测

热门文章

  1. 数据结构【图】—023邻接表深度和广度遍历
  2. CAS单点登出实现案例
  3. [C/C++标准库]_[0基础]_[优先队列priority_queue的使用]
  4. 动态列从一表的数据汇总至另外一张表中
  5. 第二次作业 项目质量管理重点知识梳理
  6. 两种方法清空memcache
  7. 【Longest Palindromic Substring】cpp
  8. YAF 关闭错误异常使用trigger_error来处理
  9. 【转】Asp.Net TreeView with CheckBox
  10. XML PUBLISHER输出excel存在科学计数