36.Python编程:进程和线程
前言
今天来了解下Python中的多任务、进程、线程等概念。当然,这些概念不是Python中特有的,不管是做iOS开发、Android开发、小程序、后台开发等,都会遇到这些基础的概念。
多任务
相信很多小伙伴在平时购买笔记本、手机时,一定听说过"8核"、"4核"的CPU,我们知道CPU是电脑、手机的处理运算的中心,也就是传说中这些电子设备的"大脑",这也是真正意义上"多任务"的基础。那什么是多任务呢?说白了就是,多个任务同时进行。比如,你一边用网易云app听音乐、一边用微信和伙伴们聊天、刷朋友圈等。
现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢?
答案就是:单核CPU在多个任务之间快速地切换。比如:CPU在执行网易云0.01秒后,又快速地执行微信0.01秒,如此循环。由于切换时间极短,我们感觉是网易云音乐和微信同时在运行,也就达到了:单核CPU时,我们仍可以一边用网易云app听音乐、一边用微信和伙伴们聊天、刷朋友圈。我们用一张放慢后的图片解释一下:
单核任务原理真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。
进程和线程
有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。
由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。当然,真正地同时执行多线程需要多核CPU才可能实现。
我们前面编写的所有的Python程序,都是执行单任务的进程,也就是只有一个线程。如果我们要同时执行多个任务怎么办?
有两种解决方案:
一种是启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务。
还有一种方法是启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务。
当然还有第三种方法,就是启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,当然这种模型更复杂,实际很少采用。
总结一下就是,多任务的实现有3种方式:
- 多进程模式;
- 多线程模式;
- 多进程+多线程模式。
同时执行多个任务通常各个任务之间并不是没有关联的,而是需要相互通信和协调,有时,任务1必须暂停等待任务2完成后才能继续执行,有时,任务3和任务4又不能同时执行,所以,多进程和多线程的程序的复杂度要远远高于我们前面写的单进程单线程的程序。
因为复杂度高,调试困难,所以,不是迫不得已,我们也不想编写多任务。但是,有很多时候,没有多任务还真不行。想想在电脑上看电影,就必须由一个线程播放视频,另一个线程播放音频,否则,单线程实现的话就只能先把视频播放完再播放音频,或者先把音频播放完再播放视频,这显然是不行的。
Python既支持多进程,又支持多线程,我们会讨论如何编写这两种多任务程序。
小结
线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。
多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。
更多了解,可关注微信公众号:人人懂编程
微信公众号:人人懂编程