进程与线程

379 阅读4分钟

进程和线程的比较

  1. 实现多任务最常用的两种方式就是多进程和多线程
  2. 实现多任务一般会设计成 Master-Worker 模式,Master负责分配任务,Worker负责执行任务,通常情况下需要一个 Master,多个Worker。
  • 如果要用多进程实现 Master-Worker,主进程就是 Master,其他进程就是 Worker。
  • 如果要用多线程实现 Master-Worker ,主线程就是 Master,其他线程就是 Worker。
  1. 多进程模式最大的优点就是稳定性高,因为一个子进程挂了,不会影响主进程和其他子进程,但是主进程挂了,所有进程会全部挂掉,但是一般来说因为 Master 是负责任务分配的,挂掉的概率很小。
  2. 多进程模式的缺点是创建进程时的代价比线程大,另外操作系统能同时运行的进程数也有限,在内存和 CPU 限制之下,如果有几千个进程同时运行,操作系统连调度都会成问题。
  3. 多线程模式其实也快不了多少,而且它的致命缺点就是任何一个线程挂了可能直接造成整个进程崩溃,因为所有线程共享进程的内存。

线程切换

  1. 无论是多进程还是多线程,数量多了就会影响效率,因为操作系统在切换进程或者线程时是有代价的,这个切换过程虽然很快,但是也需要耗费时间。如果有几千个任务同时进行,操作系统可能就主要忙着切换任务,根本没有多少时间去执行任务了,这种情况最常见的就是系统无反应,处于假死状态。
  2. 所以,是否采用多任务的第一个问题就是任务的数量,多任务一旦达到一个上限,就会消耗掉系统所有的资源,效率急剧下降,所有任务都做不好。

计算密集型和IO密集型任务

  1. 是否采用多任务的第二个问题是任务的类型,一般我嗯把任务分为计算密集型和 IO 密集型。
  2. 计算密集型任务的特点就是要进行大量的计算,消耗 CPU 资源来实现运算能力。这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间越多,CPU 执行任务的效率越低,所有要高效利用 CPU,任务的数量应当等于 CPU 的核数。另外代码运行效率很重要,此类任务最好用 C 语言编写。
  3. IO 密集型任务主要是网络、磁盘 IO 的任务,这类任务的特点是 CPU 消耗很少,任务的大部分时间都在等在 IO 操作完成,因为 IO 的速度远远低于 CPU 和内存的速度。对于 IO 密集型任务, 任务越多,CPU 效率越多,但是也要有一个限度。常见的大部分任务都是 IO 密集型任务,比如 WEB 应用。另外此类任务 99% 的时间都用于 IO,花在 CPU 上的时间很少,因此语言应该选用开发效率高的脚本语言,C语言最差。

异步 IO

  1. 考虑到 CPU 和 IO 之间的巨大速度差异,一个任务耗时大多是因为等待 IO 操作,单进程单线程模型会导致别的任务无法并行执行,因此需要多进程模型或者多线程模型来支持多任务并发执行。
  2. 如今异步 IO 可以被操作系统完全支持,可以用单进程单线程模型来执行多任务,在单核 CPU 上采用单进程模型就可以高效支持多任务,在多核 CPU 上,可以运行多个进程,数量与 CPU 的核数相同可以充分利用 CPU 资源。因为一个系统的进程数量十分有限,因此操作系统调度非常高效。用异步 IO 来实现多任务是一个主要趋势。
  3. Python 中单线程的异步编程称为协程,这样可以支持高效的多任务程序。
感谢支持 支付宝

支付宝

微信

微信