logo

该视频仅会员有权观看

立即开通课程「Python 入门」权限。

¥
199
/ 年

并发编程

我们知道现在的计算机系统都是多核的,也就是说计算机可以同时执行多个任务,比如我们平时在电脑上可以同时打开浏览器、编辑器、音乐播放器等多个应用程序,这就是多任务,一个任务其实就是一个进程,多个任务就是多个进程,这样就可以实现多任务并发执行。

当然即使是单核的 CPU 也可以通过操作系统的调度来实现多任务。我们知道 CPU 执行代码都是顺序执行的,那么单核 CPU 是怎么执行多任务的呢?答案就是操作系统轮流让各个任务交替执行,比如任务 1 执行 0.01 秒,然后切换到任务 2,任务 2 执行 0.01 秒,再切换到任务 3,这样反复执行下去。虽然每个任务都是交替执行的,但是,由于 CPU 的执行速度实在是太快了,让我们感觉到就像所有任务都在同时执行的一样。

如果是多核 CPU,就可以真正的同时执行多个任务,比如一个任务在 CPU 1 上执行,另一个任务在 CPU 2 上执行,这样就可以实现真正的并行执行多任务,但实际情况是任务数量肯定是远远多于 CPU 的核心数量的,所以操作系统也会自动把很多任务轮流调度到每个核心上执行。

一个任务就是一个进程,但更多的时候一个进程其实也不只是干一件事,比如打开一个浏览器,我们可以同时访问网页、下载文件、播放视频等,这就需要同时干多件事,我们把进程内的这些“子任务”就称为线程。多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。我们现在使用的软件几乎都用到了多线程技术,使用多线程实现并发编程可以提升程序的性能和改善用户体验,比如我们这里使用的 Mac 系统自带的“活动监视器”就可以看到当前系统的进程和线程情况。

另外我们还需要跟大家区分下两个概念:并发(concurrency)和并行(parallel)。并发通常是指同一时刻只能有一条指令执行,但是多个线程对应的指令被快速轮换地执行。比如一个处理器,它先执行线程 A 的指令一段时间,再执行线程 B 的指令一段时间,再切回到线程 A 执行一段时间。因为处理器执行指令的速度和切换的速度极快,人们完全感知不到计算机在这个过程中有多个线程切换上下文执行的操作,这就使得宏观上看起来多个线程在同时运行,但微观上其实只有一个线程在执行。并行是指同一时刻,有多条指令在多个处理器上同时执行,并行必须要依赖于多个处理器,不论是从宏观上还是微观上,多个线程可以在同一时刻一起执行的。

其实很多时候我们并不用严格区分并发和并行,所以我们有时候也把 Python 中的多线程、多进程以及异步 I/O 都视为实现并发编程的手段,但实际上前面两者也可以实现并行编程。

前面我们编写的所有的 Python 程序,其实都是执行一个任务的进程,当然一个进程内部只有一个线程,也就是只有一个任务,如果我们要同时执行多个任务怎么办?这就需要使用多进程或多线程技术了。