IO编程——转自廖雪峰博客
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编程——转自廖雪峰博客相关推荐
- 廖雪峰博客高阶函数的答案
廖雪峰博客高阶函数的答案: selfHigherOrderFn: function () {// demo1 求和function sum (fn, ...num1) {const nums = Ar ...
- python 3 廖雪峰博客笔记(三) 命令行模式与交互模式
python 的代码一般保存为 .py结尾的文本文件格式 比如 add.py 里写下如下内容 100 + 200 执行 add.py有两种方式: 1. 命令行方式:将python代码写入脚本中执行 p ...
- python做meta分析_python的MetaClass的代码分析。基于廖雪峰博客代码
1 #一张表一个类,表内每一行就是一个实例 2 ''' 3 一个单独的元类使用的程序分析.4 ''' 5 6 classField(object):7 def __init__(self, name, ...
- 编程小白的第一条博客
本人AlleyMeowy,编程小白一只,非理工科学校,非科班出身,为了成为大牛不断努力. --2018年12月23日,在博客园创建博客第一天 转载于:https://www.cnblogs.com/A ...
- python 爬虫可视化编程_Python爬虫爬取博客实现可视化过程解析
源码: from pyecharts import Bar import re import requests num=0 b=[] for i in range(1,11): link='https ...
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程 )(转自IT博客)
先看下简单的初始代码:注意其编译运行后的结果. root@xuanfei-desktop:~/cpropram/2# cat global.h //头文件 #ifndef CLOBAL_H ...
- 十大编程软件排行榜——pow_na的博客
1.Microsoft Visual C++ 这是由全球三大信息公司之一的微软公司推出的一款免费C++开发工具,并且集成了便利的除错工具,和微软Windows视窗操作系统应用程序接口.三维动画Dire ...
- java语言基础-面向对象编程-方法(廖雪峰老师官网学习记录)
Java是一种面向对象的编程语言. 面向对象编程,英文是Object-Oriented Programming,简称OOP. 面向对象编程,是一种通过对象的方式,把现实世界映射到计算机模型的一种编程方 ...
- Java RTTI与反射(参照Java编程思想与新浪博客)
一.Java的RTTI RTTI(Run-Time Type Identification,通过运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对象,每个java里面的类 ...
- python import io_详解Python IO编程
文件读写 读文件 try: # windows下utf8 f = open('./README.md', 'r', encoding='utf8', errors='ignore') print(f. ...
最新文章
- [ASP.NET MVC] 利用自定义的AuthenticationFilter实现Basic认证
- 【算法集中营】循环冗余校验
- 市场39款主流同步整流DCDC芯片横向测评预告---摘自:嘉立创商城
- .NET Forms身份验证
- 渗透专用linux镜像,安装DVWA渗透环境到CentOS7系统中(附百度云ova镜像下载)-Go语言中文社区...
- [VB.net]飞龙·网页及贴吧操作II
- OCR引擎-Tesseract
- 中超联赛提交函数的c语言,C语言文件操作(File)
- MATLAB系统辨识
- matlab函数imhist执行错误可能因为图像不是灰度的
- 谷歌浏览器如何使用访客模式 谷歌浏览器使用访客模式的方法
- 电子地图有比例尺吗?
- Mel中级教程精华篇预告
- python画正方形-用python画一个正方形
- git 如何把develop分支代码合并到master主分支
- PTA 7-55 剿灭魔教 (30分)(拓扑排序bfs版)
- 什么是 yum?更改yum源 yum的相关命令
- Arduino for Esp8266 基础篇之Ticker
- elasticsearch学习 part4
- 2019最新黑客风云VIP 网站攻防安全课程(完整)