Python中的多任务概述

多任务概述

很多同学都听说过,现在操作系统比如 Windows,Linux,Unix,Mac OS 等,都是支持 多任务 的操作系统!

什么是多任务?

简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word写作业,这就是多任务。

CPU如何实现多任务?

现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU指定代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢?

答案就是操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,在切换到任务3 … 这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像是所有任务都在同时执行一样!

真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。

串行,并行,并发

串行 Serial

多任务某一时刻只能有一个任务在运行,执行时一个任务执行完再执行另一个

并行 Parallel

它是指同一时刻,有多条指令在多个处理器上同时执行,并行必须要依赖于多个处理器。不论是从宏观还是微观上,多个线程都是在同一时刻一起执行的。

并行只能在多处理器系统中存在,如果我们的计算机处理器只有一个核,那就不可能实现并行。而并发在单处理器和多处理器系统中都是可以存在的,因为仅靠一个核,就可以实现并发。

并发 Concurrent

并发指的是通过操作系统的各种任务调度算法(如时间片轮巡),实现宏观上多个任务 “一起” 执行

它是指同一时刻只能有一条指令执行,但是多个线程对应的指令被快速轮换地执行。比如一个处理器,它先执行线程 A 的指令一段时间,在执行线程 B 的指令之短时间,再切回到线程 A 执行一段时间。

由于处理器执行指令的速度和切换的速度非常非常块,人完全感知不到计算机在这个过程中有多少线程切换上下文执行的操作,这就使得宏观上看起来多个线程在同时运行。但是微观上只是个处理器在连续不断地在多个线程之间切换和执行,每个线程的执行一定会占用这个处理器一个时间片段,同一时刻,其实只有一个线程在执行。

Python中的多任务概述

并发与并行并不是互斥的概念,在单核CPU上,每一时刻仅能有一个程序执行,所以并发只能是分时地交替执行,倘若在多核CPU上启用并发,那么程序的执行就可以是既并发又并行的。

举个例子,比如系统处理器需要同时运行多个线程。如果系统处理器只有一个核,那它只能通过并发的方式来运行这些线程。如果系统处理器有多个核,当一个核在执行一个线程时,另一个核可以执行另一个线程,这样这两个核就实现了并行执行,当然其它的线程也可能和另外的线程处在同一个核上执行,它们之间就是并发执行。具体的执行方式,就取决于操作系统的调度了。

同步,异步

同步

在发出一个功能调用时,没有得到结果之前,该调用就不返回,程序也不会接着往下执行。按照这个定义,其实绝大多数函数都是同步调用。

Python中的多任务概述

异步

当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调(Handler机制)来通知调用者。

Python中的多任务概述

备注

串行,并行和并发(与硬件结合):说的是软件的运行过程,在计算机内存中加载了数据,由CPU执行数据运算的程序运行过程。

同步和异步(与软件结合):说的是软件中代码的执行方式,细化到函数的调用过程,宏观到多个业务的执行流程。