从概念上讲,线程和协程是有区别的,理解为线程可以并行,协程不能并行。

但是由于 CPython 的具体实现问题( GIL )上,线程和协程在某种程度上是一致的。

  1. 线程也就是有多个执行流,由操作系统负责调度执行流,由于执行流的切换是由操作系统负责的,所以对于编程者来说是完全透明的,无感知的(除去同步问题)。
  2. 同时呢,由于执行流的调度是有操作系统负责的,在 SMP 上可以实现并行运行,也就是两个线程同时运行。

但是协程也是有多个执行流

  1. 但是这个执行流是由用户来负责的,所以编程者需要大量处理协切换的问题。
  2. 同时呢,由于协程是在用户的控制下进行切换。
  3. 对操作系统来说,这只是一个线程。
  4. 所以在 SMP 上无法享受到多线程的并发优势。

为什么在 Python 上大家一般推崇协程而不是线程呢?

线程的切换在操作系统的调度是,某一个线程运行了一段时间之后(可能是几十毫秒),这个时候就会发生调度切换。 去运行其他的线程,这种频繁的线程切换实际上也是有开销的,可能会有几百个时钟周期。 而这种线程切换是周期性的。所以总体来说开销还是蛮大的。 但是对于协程来说,由于协程的切换是用户控制的,那么也就是说,少去了很多不必要的线程切换,因为用户自己控制线程切换时,大概率是真的有必要切换。所以比操作系统切换来说,开销更少了,操作系统不需要再进行周期性的切换了。