怀化二医院网站,页面制作的公司,django做的网站模板,企业网站建设的特点由于协程需要支持挂起、恢复、因此对于挂起点的状态保存就显得机器关键。类似的#xff0c;线程会因为CPU调度权的切换而被中断#xff0c;它的中断状态会保存在调用栈当中#xff0c;因而协程的实现也按照是否开辟相应的调用栈存在以下两种类型#xff1a;
有栈协程…由于协程需要支持挂起、恢复、因此对于挂起点的状态保存就显得机器关键。类似的线程会因为CPU调度权的切换而被中断它的中断状态会保存在调用栈当中因而协程的实现也按照是否开辟相应的调用栈存在以下两种类型
有栈协程Stackful Coroutine每一个协程都会有自己的调用栈。与线程类似但不同体现在调度上。
无栈协程Stackless Coroutine协程没有自己的调用栈挂起点的状态通过状态机或者闭包语法来实现。
有栈协程的优点可以在任意函数调用层级的任意位置进行挂起并转移调度权但会有一定的内存开销。
kotlin协程通常被认为是一种无栈协程的实现。它的控制流转依靠对协程体本身编译生成的状态机的状态流转来实现变量保存也是通过闭包语法来实现的。不过kotlin的协程可以在挂起函数范围内的任意调用层级挂起换句话说我们启动一个kotlin协程可以在其中任意嵌套suspend函数。
suspend fun level_0() { println(level 0) level_1()//执行挂起
}
suspend fun level_1() { println(level 1) suspendNow()//执行挂起
}
suspend fun suspendNow() suspendCoroutineUnit{....}
按调度方式分类
调度过程中根据协程转移调度权的目标又将协程分为对称协程和非对称协程
对称协程Symmtric Coroutine任何一个协程都是相互独立且平等的调度权可以在任意协程之间转移。
非对称协程Asymmetric Coroutine协程出让调度权的目标只能是它的调用者即协程之间存在调用和被调用关系
线程与协程的区别
线程属于操作系统概念协程属于编程语言范畴它属于应用程序的API层可以运行在线程框架上由线程框架在背后操作代码的调度
协程本身的概念实际包含了线程调度的概念只有能控制线程切换才有可能实现真正的异步功能。