一、进程和线程:

对操作系统来说,线程是最小的执行单元(消耗CPU),进程是最小的资源管理单元(消耗内存)。

python 协程中可以起线程么 python协程和线程_用户态

线程之间的协作存在痛点,耗费性能:

1.同步锁。

2.线程阻塞状态和可运行状态之间的切换。

3.线程上下文的切换。

二、协程,英文Coroutines,是一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。

python 协程中可以起线程么 python协程和线程_用户态_02

协程不是进程也不是线程,而是一个特殊的函数,这个函数可以在某个地方挂起,并且可以重新在挂起处外继续运行。所以说,协程与进程、线程相比并不是一个维度的概念。

一个线程内的多个协程虽然可以切换,但是多个协程是串行执行的,只能在一个线程内运行,没法利用CPU多核能力。

!!!协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。

这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。

python 协程中可以起线程么 python协程和线程_数据_03

建了一个consumer的协程,在主线程中生产数据,协程中消费数据。

其中 yield 是python当中的语法。当协程执行到yield关键字时,会暂停在那一行,等到主线程调用send方法发送了数据,协程才会接到数据继续执行。

但是,yield让协程暂停,和线程的阻塞是有本质区别的。

协程的暂停完全由程序控制,线程的阻塞状态是由操作系统内核来进行切换

进程和线程的切换者都是 操作系统内核,切换过程都是“用户态到内核态到用户态”的方式。

协程的切换者是用户(编程者或应用程序),切换过程在用户态中完成,协程不会被抢占

因此,协程的开销远远小于线程的开销。