这里写目录标题
协程的概念
协程的概念是相对多进程或者多线程来说的,他是一种协作式的用户态线程。协作式执行说的就是,想要切换线程,你必须要用户手动来切换。与之相对的,线程和进程是以抢占式执行的,意思就是系统帮我们自动快速切换线程和进程来让我们感觉同步运行的感觉,这个切换动作由系统自动完成。
协程出现的目的
协程主要是为了提高并发,而且主要是IO并发。对于IO密集任务,利用回调函数,配合协程,可以使逻辑更加简单清晰,
协程为什么快
协程为什么那么快原因就是因为,无需系统自动切换(系统自动切换会浪费很多的资源),而协程是我们用户手动切换,而且是在同一个栈上执行,速度就会非常快而且省资源。
协程存在的问题
协程并不适合并行计算或者并行处理任务,因为同一时刻运行的协程数不可能大于操作系统线程,而且需要协程切换,不如线程池。
协程的分类
我们可以依照三个问题区分协程:
- 控制传递(Control-transfer)机制
- 协程是否为栈式(Stackful)构造
- 协程是否作为语言的第一类(First-class)对象提供
控制传递机制
根据控制传递机制的不同区分出了非对称协程和对称协程。非对称协程知道它的调用者,其在挂起时转让控制权给它的调用者,然后调用者根据算法调用其他非对称协程进行工作。相比之下,所有的对称协程都是等价的,控制权直接在对称协程之间进行传递,即对称协程在挂起时主动指明另外一个对称协程来接收控制权。
协程是否为栈式(stackfull)构造
无栈协程不保存调用栈以及寄存器等信息,不属于真正的重入,因此一些局部变量都是无法使用的。stackless协程仅能在顶层部分被挂起。
有栈协程是真正的基于栈的重入,可以从某个嵌套的调用点上恢复执行。stackfull协程在切换的时候,需要把当前的栈保存起来,以便在恢复的时候再次恢复执行。因此stackful协程可以在内部的嵌套函数中被挂起,在挂起点恢复执行。
协程是否作为语言的第一类(First-class)对象提供
协程被作为first-class对象提供,那么其可以作为参数被传递,由函数创建并返回,并存储在一个数据结构中供后续操作,也可以被开发者自由的维护。
为什么协程只能串行运行
一个线程内的多个协程的运行是串行的。如果有多核CPU的话,多个进程或一个进程内的多个线程是可以并行运行的,但是一个线程内的多个协程却绝对串行的,无论有多少个CPU(核)。这是因为一个线程运行在一个CPU上,其可以运行多个协程,但是由于只有一个核,当一个协程运行时,其他协程必须挂起。