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编程接口。

注意,本章的IO编程都是同步模式,异步IO由于复杂度太高,后续涉及到服务器端程序开发时我们再讨论。

转载于:https://www.cnblogs.com/lao454490095/p/4178803.html

IO编程——转自廖雪峰博客相关推荐

  1. 廖雪峰博客高阶函数的答案

    廖雪峰博客高阶函数的答案: selfHigherOrderFn: function () {// demo1 求和function sum (fn, ...num1) {const nums = Ar ...

  2. python 3 廖雪峰博客笔记(三) 命令行模式与交互模式

    python 的代码一般保存为 .py结尾的文本文件格式 比如 add.py 里写下如下内容 100 + 200 执行 add.py有两种方式: 1. 命令行方式:将python代码写入脚本中执行 p ...

  3. python做meta分析_python的MetaClass的代码分析。基于廖雪峰博客代码

    1 #一张表一个类,表内每一行就是一个实例 2 ''' 3 一个单独的元类使用的程序分析.4 ''' 5 6 classField(object):7 def __init__(self, name, ...

  4. 编程小白的第一条博客

    本人AlleyMeowy,编程小白一只,非理工科学校,非科班出身,为了成为大牛不断努力. --2018年12月23日,在博客园创建博客第一天 转载于:https://www.cnblogs.com/A ...

  5. python 爬虫可视化编程_Python爬虫爬取博客实现可视化过程解析

    源码: from pyecharts import Bar import re import requests num=0 b=[] for i in range(1,11): link='https ...

  6. __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )(转自IT博客)

    先看下简单的初始代码:注意其编译运行后的结果. root@xuanfei-desktop:~/cpropram/2# cat global.h //头文件 #ifndef CLOBAL_H       ...

  7. 十大编程软件排行榜——pow_na的博客

    1.Microsoft Visual C++ 这是由全球三大信息公司之一的微软公司推出的一款免费C++开发工具,并且集成了便利的除错工具,和微软Windows视窗操作系统应用程序接口.三维动画Dire ...

  8. java语言基础-面向对象编程-方法(廖雪峰老师官网学习记录)

    Java是一种面向对象的编程语言. 面向对象编程,英文是Object-Oriented Programming,简称OOP. 面向对象编程,是一种通过对象的方式,把现实世界映射到计算机模型的一种编程方 ...

  9. Java RTTI与反射(参照Java编程思想与新浪博客)

    一.Java的RTTI  RTTI(Run-Time Type Identification,通过运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对象,每个java里面的类 ...

  10. python import io_详解Python IO编程

    文件读写 读文件 try: # windows下utf8 f = open('./README.md', 'r', encoding='utf8', errors='ignore') print(f. ...

最新文章

  1. [ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证
  2. 【算法集中营】循环冗余校验
  3. 市场39款主流同步整流DCDC芯片横向测评预告---摘自:嘉立创商城
  4. .NET Forms身份验证
  5. 渗透专用linux镜像,安装DVWA渗透环境到CentOS7系统中(附百度云ova镜像下载)-Go语言中文社区...
  6. [VB.net]飞龙·网页及贴吧操作II
  7. OCR引擎-Tesseract
  8. 中超联赛提交函数的c语言,C语言文件操作(File)
  9. MATLAB系统辨识
  10. matlab函数imhist执行错误可能因为图像不是灰度的
  11. 谷歌浏览器如何使用访客模式 谷歌浏览器使用访客模式的方法
  12. 电子地图有比例尺吗?
  13. Mel中级教程精华篇预告
  14. python画正方形-用python画一个正方形
  15. git 如何把develop分支代码合并到master主分支
  16. PTA 7-55 剿灭魔教 (30分)(拓扑排序bfs版)
  17. 什么是 yum?更改yum源 yum的相关命令
  18. Arduino for Esp8266 基础篇之Ticker
  19. elasticsearch学习 part4
  20. 2019最新黑客风云VIP 网站攻防安全课程(完整)

热门文章

  1. new对象后的代码块(匿名类)
  2. linux下磁盘占用达到100%了,找不到哪些大文件耗尽了磁盘。
  3. 简单的Hibernate入门简介
  4. Spring Cloud 2020 年路线图
  5. 从病毒手里抢时间:百度研究院研发RNA测序算法检测速度提升120倍
  6. 搭建自己的 CDN 会有哪些乐趣和好处?
  7. 解读龙哥的书:用户是什么?
  8. countable php,ThinkPHP容器之Countable巧用
  9. ppt修复无法读取_CVE20201938 Tomcat 文件读取/包含漏洞复现
  10. shell应用之简单计算器