一、进程和线程:
对操作系统来说,线程是最小的执行单元(消耗CPU),进程是最小的资源管理单元(消耗内存)。
线程之间的协作存在痛点,耗费性能:
1.同步锁。
2.线程阻塞状态和可运行状态之间的切换。
3.线程上下文的切换。
二、协程,英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
协程不是进程也不是线程,而是一个特殊的函数,这个函数可以在某个地方挂起,并且可以重新在挂起处外继续运行。所以说,协程与进程、线程相比并不是一个维度的概念。
一个线程内的多个协程虽然可以切换,但是多个协程是串行执行的,只能在一个线程内运行,没法利用CPU多核能力。
!!!协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。
这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。
建了一个consumer的协程,在主线程中生产数据,协程中消费数据。
其中 yield 是python当中的语法。当协程执行到yield关键字时,会暂停在那一行,等到主线程调用send方法发送了数据,协程才会接到数据继续执行。
但是,yield让协程暂停,和线程的阻塞是有本质区别的。
协程的暂停完全由程序控制,线程的阻塞状态是由操作系统内核来进行切换。
进程和线程的切换者都是 操作系统内核,切换过程都是“用户态到内核态到用户态”的方式。
协程的切换者是用户(编程者或应用程序),切换过程在用户态中完成,协程不会被抢占。
因此,协程的开销远远小于线程的开销。