IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。

比如你打开浏览器,访问新浪首页,浏览器这个程序就需要通过网络IO获取新浪的网页。浏览器首先会发送数据给新浪服务器,告诉它我想要首页的HTML,这个动作是往外发数据,叫Output,随后新浪服务器把网页发过来,这个动作是从外面接收数据,叫Input。所以,通常,程序完成IO操作会有Input和Output两个数据流。当然也有只用一个的情况,比如,从磁盘读取文件到内存,就只有Input操作,反过来,把数据写到磁盘文件里,就只是一个Output操作。

IO编程中,Stream(流)是一个很重要的概念,可以把流想象成一个水管,数据就是水管里的水,但是只能单向流动。Input Stream就是数据从外面(磁盘、网络)流进内存,Output Stream就是数据从内存流到外面去。对于浏览网页来说,浏览器和新浪服务器之间至少需要建立两根水管,才可以既能发数据,又能收数据。

由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。举个例子来说,比如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这100M数据可能需要10秒,怎么办呢?有两种办法:

第一种是CPU等着,也就是程序暂停执行后续代码,等100M的数据在10秒后写入磁盘,再接着往下执行,这种模式称为同步IO;

另一种方法是CPU不等待,只是告诉磁盘,“您老慢慢写,不着急,我接着干别的事去了”,于是,后续代码可以立刻接着执行,这种模式称为异步IO。

同步和异步的区别就在于是否等待IO执行的结果。好比你去麦当劳点餐,你说“来个汉堡”,服务员告诉你,对不起,汉堡要现做,需要等5分钟,于是你站在收银台前面等了5分钟,拿到汉堡再去逛商场,这是同步IO。

你说“来个汉堡”,服务员告诉你,汉堡需要等5分钟,你可以先去逛商场,等做好了,我们再通知你,这样你可以立刻去干别的事情(逛商场),这是异步IO。

很明显,使用异步IO来编写程序性能会远远高于同步IO,但是异步IO的缺点是编程模型复杂。想想看,你得知道什么时候通知你“汉堡做好了”,而通知你的方法也各不相同。如果是服务员跑过来找到你,这是回调模式,如果服务员发短信通知你,你就得不停地检查手机,这是轮询模式。总之,异步IO的复杂度远远高于同步IO。

操作IO的能力都是由操作系统提供的,每一种编程语言都会把操作系统提供的低级C接口封装起来方便使用,Python也不例外。我们后面会详细讨论Python的IO编程接口。

最新文章

  1. 5天揭秘js高级技术-第一天
  2. SEO是企业发展的永恒主题
  3. 迁移学习(Transfer Learning)(转载)
  4. Pots of gold game:看谁拿的钱多
  5. POJ 1459
  6. poj2265
  7. java线程join的意思(转自http://zjj1211.blog_51cto_com)
  8. SVN Cleanup failed的解决办法
  9. MySQL查询执行过程
  10. 浏览器的CSS Hacks
  11. mybatis学习(一)一个在idea下的实例
  12. Ajax请求过程中显示“进度”的简单实现
  13. CSS选择器一览
  14. SqlServer查询数据库所有表
  15. Java 字符终端上获取输入三种方式
  16. Nginx防盗链的3种方法
  17. 让windows10的右键菜单既显示传统cmd又显示powershell
  18. 学习 Spring (十三) AOP 配置
  19. 【译】10. Java反射——数组
  20. 解决Skyline 6.5版本中3DML模型单体化后外部网页挂接问题

热门文章

  1. 3、scala函数入门
  2. OpenCV : 基于切线方向的边缘增强算法
  3. js截取字符串测试
  4. Python-logging模块的初级使用
  5. C 预处理程序指令(CPP)
  6. eas之新建窗口
  7. 创建对象—从es5到es6
  8. [POI2010] Intelligence test
  9. 多种方法爬取猫眼电影Top100排行榜,保存到csv文件,下载封面图
  10. java 定时器任务模板