前言
其实关于Python的并发编程是比较难写的一章,因为涉及到的知识很复杂并且理论偏多,所以在这里我尽量的用一些非常简明的语言来尽可能的将它描述清楚,在学习之前首先要记住一个点:并发编程永远的宗旨就是提高程序的运行效率,也是围绕CPU来进行优化的一种技术手段。
像我们之前学习过的网络编程中,我们只是基于socketserver
模块让我们的Server端有了处理多任务的能力,但是我们并不了解它的底层是怎么做到的,在学习完并发编程后,尝试自己阅读一下socketserver
源码,你将会大有收获。
并发编程很重要吗?是的,非常重要,如果你想进入PythonWeb
领域那么著名的框架如Django
,Tornado
,Flask
等等底层都是有基于本章节的知识点,如果你想进入爬虫领域那就更不用说了,非常强大的scrapy
框架也是基于我们所学的这些东西累积起来的。
好了废话不多说,让我们开始进入并发编程的学习吧。
从任务处理角度看待操作系统发展史
这一节主要是理论知识,了解计算机任务处理方式的演变过程,能够让我们更快的理解和学习并发编程。
首先,我们先来回顾一下操作系统方面的一些知识。
操作系统的作用:管理硬件,目的就是让用户更加方便的来操控计算机底层的硬件。
可以看到操作系统对于人们操控计算机进行作业有着不可小觑的功劳,那么在早期没有操作系统的时候你能想象是什么样子吗?现在我们来看一看。
无操作系统时任务的处理方式
早期的计算机并没有操作系统,而是通过纸带来进行程序的编辑,它有三台设备分别是:输入机,计算机,输出机。
那个时候的程序员需要一起约定好时间,来轮流的对自己的程序进行优化,因为那个时候的计算机在同一时刻下只能由一个人去运行和掌控,我们来看一下它的计算流程:
这个时代的计算机一次只能跑一个人的程序,没有其他干扰,那么它的缺点也很明显,一次只能一个人使用而后面想要使用的人必须得等待前一个人用完之后才行。其执行效率非常低下,最关键的就是人在进行与计算机交互的时候计算机的运算器是没有任何工作的,这就造成了资源上极大的浪费,那么这种浪费可以理解为I/O阻塞
。
为了解决这个问题,批处理系统横空出世了。
批处理系统的诞生
相比于前一代计算机处理任务的方式,批处系统的诞生让这一代计算机有了极大的进步,并且输入也不再使用纸带,而是采用磁带,批处理操作系统可以将多个用户的任务同时提交(但是不能同时运行)。
假设有三个程序员需要使用这台计算机,他们将自己的程序全部交由一个程序员让其进行人机之间的交互,那么这样就节省了三倍的时间。但是这样的缺点也很明显,只能等待三个人的程序全部处理完后大家才能拿到各自的结果,这个等待过程是十分漫长的。
在这里,出现了一种自动化的工作方式,计算机也就是中间的7094机器能够去区分出每个程序员自己的程序,那么其内部肯定是由一种代码支持它有了这种功能,那个这个就是批处理系统。
单处理的批处理系统最大的缺点依然还是拥有I/O阻塞
,能不能把中间的两个小人全部干掉让计算机来做他们做的事儿呢?当然可以,但是....当时的人还没那么聪明。