1、多任务操作系统
Windows、Linux和Mac OS等一些常用的操作系统都是多任务操作系统。其中,多任务是指操作系统可以同时运行多个任务。例如,用户使用Windows操作系统可以一边用浏览器上网查阅资料,一边用音乐播放器听歌,一边用PowerPoint制作幻灯片,这就是多任务。多任务至少有3个任务在操作系统中同时运行,与此同时还有一些任务在后台运行着,只是这些任务没有显示在桌面上而已。
基于摩尔定律,近年来CPU技术得到了飞速地发展,现在多核CPU已经成为计算机的“标配”。然而,即使在多年前使用单核CPU,Windows操作系统本身就是多任务操作系统。多任务操作系统的CPU是顺序执行代码的,那么单核CPU执行多任务就需要时分复用,即操作系统轮流让各个任务交替执行。例如,操作系统中同时有3个任务,任务1执行0.01秒,切换到任务2;任务2执行0.01秒,切换到任务3;任务3执行0.01秒,切换到任务1;任务1执行0.01秒,切换到任务2……这样反复循环执行下去。实际上,在单核CPU中,每个任务都是交替执行的,但是由于CPU的主频大多数以吉赫兹为单位,执行速度极快,用户在使用计算机时,是感觉不到时间间隔的,因此,用户使用计算机时就像所有任务都在同时执行一样。
真正地同时运行多任务只能在多核CPU上实现,但由于CPU的核心数量远远小于任务的数量,因此,目前操作系统依旧效仿单核CPU时的策略,也会自动将很多任务轮流调度到每个核心上运行。
2、进程与线程
在操作系统中,一个任务就是一个进程(Process)。例如,打开一个浏览器就是启动了一个浏览器进程,打开一个播放器就启动了一个播放器进程,打开两个Word文档就启动了两个Word进程。
有些进程可能会同时做多件事,如Word可以同时进行打字、拼写检查、打印等。在一个进程内部,多件事需要同时做,那么多个子任务就需要同时运行,这些子任务称为线程(Thread)。
一个进程至少有一个线程,这是因为一个进程至少要做一件事。如上例所述的Word进程可以有多个线程,而且多个线程可以同时运行。与多进程类似,多线程的运行方式也是由操作系统在多个线程之间进行快速切换。在操作系统中每个线程都短暂地交替运行,而对于用户而言,看起来就像同时在运行一样。当然,基于多核CPU能够真正地同时运行多线程。
3、多进程与多线程
前文中编写的Python程序,都是执行单任务的进程,而且只有一个线程。如果多个任务要同时执行怎么办?实际中有以下两种常用的解决方案:
①多进程,即启动多个进程,多个进程可以同时执行多个任务(注意,此处每个进程只有一个线程)。
②多线程,即只启动一个进程,在这个进程中启动多个线程,这样多个线程也可以同时执行多个任务。
除此之外,还可以采用混合模式,即先启动多个进程,每个进程再启动多个线程。但由于这种模式比以上两种更复杂,实际中很少采用。
执行多任务时,通常各个任务之间是有关联的,需要相互通信和协调。例如,有多个任务,任务1有时必须暂停等待任务2完成后才能继续执行,任务3和任务4有时又不能同时执行,因此,实现的复杂度要远远高于单进程单线程的程序。
即使多进程或多线程的程序复杂度高且调试困难,但现实中很多情况都需要设计多任务框架才能解决问题。例如,在手机上看电影时,播放器进程中就必须有一个线程播放视频,另一个线程播放音频,否则,如果采用单线程来实现,那么就只能先将视频播放完再播放音频,或者先将音频播放完再播放视频,这对用户而言显然是不可接受的。
总而言之,多任务可以由多进程完成,也可以由一个进程内的多线程完成。如何调度进程和线程,完全由操作系统决定,Python程序自己不能决定什么时候执行,执行多长时间。多进程和多线程的程序涉及同步、数据共享等问题,编写起来比较复杂。
Python既支持多进程,又支持多线程,下面会介绍编写这两种多任务程序的方法。