(windows)python-2-7-学习笔记 四十六 IO编程

2019071250552

IO 编程

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

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

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

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

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

另一种方法是 CPU 不等待,只是告诉磁盘去写,CPU 接着执行其它的事情,于是,后续代码可以立刻接着执行,这种模式称为异步 IO

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

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

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

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

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

发表评论

zh_CNChinese
zh_CNChinese