Python进程与线程概述
在实现多任务时,我们通常采用Master-Worker模式。Master负责分配任务,而Worker负责执行任务。在多任务环境下,通常有一个Master和多个Worker。
- 多进程:主进程作为Master,其他进程作为Worker。
- 多线程:主线程作为Master,其他线程作为Worker。
多进程与多线程的优缺点
多进程
优点:
- 稳定性高:一个子进程崩溃不会影响主进程和其他子进程。
- 适用于计算密集型任务:因为每个进程都有独立的内存空间和CPU资源,可以真正实现并行计算。
缺点:
- 创建进程开销大:在Windows下尤其明显。
- 操作系统调度压力大:当进程数量过多时,操作系统可能主要忙于切换任务,导致效率下降。
多线程
优点:
- 通常比多进程快一些(但差距不大)。
- 在Windows下效率更高,因此微软的IIS服务器默认采用多线程模式。
缺点:
- 稳定性问题:任何一个线程崩溃都可能导致整个进程崩溃。
- 共享内存带来的复杂性:线程间共享内存需要额外的同步机制来避免竞争条件。
线程切换与多任务效率
无论是多进程还是多线程,当任务数量过多时,效率都会下降。这是因为操作系统在切换任务时需要保存和恢复执行环境,这个过程虽然很快,但也会耗费时间。如果任务切换过于频繁,操作系统可能主要忙于切换任务,而没有多少时间执行任务本身。
计算密集型与IO密集型任务
计算密集型任务:
- 特点:需要大量计算,消耗CPU资源。
- 适合用多进程实现并行计算,但任务数量应等于CPU核心数以最大化效率。
- Python不适合此类任务,因为脚本语言运行效率较低。C语言更适合。
IO密集型任务:
- 特点:CPU消耗少,大部分时间等待IO操作完成。
- 任务越多,CPU效率越高(但有限度)。
- 对于此类任务,开发效率最高的语言(如脚本语言)是首选。C语言开发效率较低。
异步IO与事件驱动模型
现代操作系统支持异步IO,允许在等待IO操作完成时执行其他任务。这使得单进程单线程模型能够高效地支持多任务。Nginx是一个支持异步IO的Web服务器示例。
在Python中,单线程的异步编程模型称为协程。协程允许在单个线程内实现并发执行,基于事件驱动编写高效的多任务程序。
总结
- 多进程适用于计算密集型任务,但创建进程开销大。
- 多线程适用于IO密集型任务,但存在稳定性问题。
- 异步IO和事件驱动模型是现代多任务编程的主要趋势。
- Python中可以使用协程来实现单线程内的并发执行。