并行计算
现代操作系统都是支持多任务的操作系统,也就是说操作系统可以同时运行多个任务。而且目前多核CPU已经非常普及,即便是以前的单核CPU也可以执行多任务。
操作系统执行多任务的原理就是轮流让各个任务交替执行,术语称为时间片轮转。这样在CPU高速的执行下,我们就感觉所有任务都在同时执行一样。真正的并行执行只能在多核CPU上实现,但是任务数量远远多于CPU核心数量,所以在每个CPU核心上依旧是采用轮转的运行方式。
对于操作系统来说,一个任务就是一个进程。但是一个进程不见得同时只做一件事,进程内的子任务就称为线程。所以一个进程至少有一个线程。我们之前编写的Python程序都是单任务的,也就是只有一个线程。如果需要执行多个任务就有三种解决方案:
- 启动多个进程,由多个进程同时执行并行任务。
- 启动多个线程,由多个线程同时执行并行任务。
- 启动多个进程,每个进程再启动多个线程。
第三种解决方案一般过于复杂,很少采用。Python既支持多进程,也支持多线程,如何选择取决于我们的程序设计。但是始终要记得,如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,以及执行多长时间。
多进程的最大优点是稳定性高,一个子进程的崩溃不会影响主进程和其他子进程。但多进程的缺点就是进程创建代价较高,操作系统中进程总数还是有上限的。多线程的模式通常会比多进程快一些,但也只是有限的一点儿,而且任何一个线程出现问题,都可能造成整个进程的崩溃。
所以采用并行处理的形式是受任务类型影响的,计算密集型和IO密集型是不一样的。计算密集型任务主要消耗CPU的资源,所以需要高效的利用CPU,通常会选择C语言编写并且使并行计算任务数量等于CPU的核心数量。IO密集型则相反,消耗CPU资源少,但需要等待网络和磁盘等操作完成,所以此时Python是首选,并且可以选择多线程来完成。