回顾协程
一、协程简介
1.协程定义
协程的定义可以通过它与函数和线程的不同来进行界定,来加深其特点印象的效果。
协程与函数的区别
函数不能中断,协程可以转换
协程和函数的不同之处是,函数一旦被调用,只能从头开始执行,直到函数执行结束退出,而协程则可以执行到一半就退出(称为yield),但此时协程并未真正结束,只是暂时让出CPU执行权,在后面适当的时机协程可以重新恢复运行(称为resume),在这段时间里其他的协程可以获得CPU并运行,所以协程也称为轻量级线程。也同样因此,协程使用时最好使用一些表示状态的参数,用来判断是否切出等问题。
函数空间为栈,协程空间要算
函数一般不需要申请空间,可以直接执行。对于协程来说,需要具体的大小,需要申请具体的空间。由于需要提前设置空间,那么就可能会有空间不足等情况会造成不可预知的后果。
协程与线程的区别
线程并发执行,协程不能并发
协程虽然被称为轻量级线程,但在单线程内,协程并不能并发执行,只能是一个协程结束或yield后,再执行另一个协程,而线程则是可以真正并发执行的。其实这点也好理解,毕竟协程只是以一种花里胡哨的方式去运行一个函数,不管实现得如何巧妙,也不可能在单线程里做到同时运行两个函数,否则还要多线程有何用?这也同样说明了协程不需要用锁,若是使用锁可能会造成死锁。
线程切换消耗多,协程切换耗费小
线程在进行切换时,需要切换到内核态来进行转换,协程可以直接通过用户态进行转换。协程切换时,上下文包含了函数在当前执行状态下的全部CPU寄存器的值,这些寄存器值记录了函数栈帧、代码的执行位置,线程需要切换的消息就更多了。
2.协程的使用方式
对称协程
对称协程一般时指协程之间的地位,也就是说不分,所有协程都是平等的。协程可以创建协程进行其他操作
非对称协程
非对称协程则是地位上的不对称,有一个主协程来管理其他的协程。这也就意味着子协程再创建子协程可能会导致混乱。并且协程执行完后必须要切换到主协程,主协程再切换到别的需要的完成的协程。
sylar库里的协程
sylar库使用的是非对称协程的用法,而协程分为了不同的两种状态。
协程的形式
协程两种不同状态,其中最重要的区别在于主协程的位置。
1.用户自己使用的形式
用户自己创建协程并使用,用户自己使用协程时会自动创建当前线程的主协程,通过主协程控制当前协程和后续子线程里其他创建的协程。
2.管理器使用的协程形式
管理器可能需要使用多个线程内部的多个协程,而这些信息需要在管理器中进行统一。因此主协程的信息或者协程的后续切换信息都需要放入管理器内。
协程的结构
1.状态
由于协程可以切入切出的特性,协程的状态是非常有必要的,通过状态将协程的情况进行了表示在这里分为了
INIT:协程内的函数还未开始运行
HOLD:协程已经转换出去,本协程内的函数暂停转换到其他的协程去了
EXEC: 函数正在运行
TERM:函数已经运行完成
READY:一般使用时和INIT相同,但应该是表示有耗费时间程序在运行时切换出去的标志
EXCEPT:函数运行时有异常
2.结构图
非对称协程结构
协程简要结构
协程结构主要是将申请内存部分与整体分开