协程概述
官方描述:协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器)上调度执行,而代码则保持如同顺序执行一样简单。
- 协程是轻量级的线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程是有系统进行调度的,创建一个线程的代价是十分昂贵的, 需要给它分配内存、列入调度,同时在线程切换的时候还要执行内存换页,CPU 的缓存被清空,切换回来的时候还要重新从内存中读取信息,破坏了数据的局部性。
协程是依赖与线程的,创建一个协程几乎是无代价的,同时协程也是由使用者控制的。一个线程中可以创建任意个协程,所以说协程是非常轻量级的。
kotlin层面上来说,是伪协程
-
协程构造器 (Coroutine Builders)
runBlocking:创建一个会阻塞当前线程的协程,直到协程结束,用于测试
GlobalScope.launch:创建一个顶层的不会阻塞的协程,返回一个 Job 对象
launch:创建一个不会阻塞当前线程、没有返回结果的 Coroutine,但会返回一个 Job 对象.需要在协程内使用
withContext:创建一个可以返回执行结果的Coroutine.多个withContext之前是同步的.需要在协程内使用
asyn:创建一个可以返回执行结果的Coroutine.多个asyn是异步的.需要在协程内使用
-
协程作用域(CoroutineScope)
CoroutineScope管理该作用域里的所有协程.一个CoroutineScope可以拥有多个子CoroutineScope
[图片上传失败...(image-37791b-1647945716958)]
-
协程取消(Job)
Job是协程启动后的返回对象,可以通过Job来判断是当前协程的状态,也可以对此协程进行取消操作
wait children +-----+ start +--------+ complete +-------------+ finish +-----------+ | New | -----> | Active | ---------> | Completing | -------> | Completed | +-----+ +--------+ +-------------+ +-----------+ | cancel / fail | | +----------------+ | | V V +------------+ finish +-----------+ | Cancelling | --------------------------------> | Cancelled | +------------+ +-----------+
协程启动模式(CoroutineStart):
DEFAULT:默认启动模式,立即执行
LAZY:立即执行,并且开始执行前无法被取消ATOMIC:需要手动触发才会执行
UNDISPATCHED:立即执行,直到遇到第一个挂起点
-
协程异常
协程在使用的时候传入CoroutineExceptionHandler即可以捕获异常
GlobalScope创建的协程自己处理,其他协程正常执行
Job嵌套和coroutineScoope创建的协程会交给父job处理,并且取消所有的子协程
-
挂起函数 suspend
CPS(Continuation-Passing-Style 续体传递风格)
In functional programming, continuation-passing style (CPS) is a style of programming in which control is passed explicitly in the form of a continuation. (from Wikipedia.)
假设我们约定一种编程规范,所有的函数都按照上述的方式来定义,即所有的函数都直接返回结果值,而是在参数列表最后的位置传入一个 callback 函数参数,并在函数执行完成时通过这个 callback 来处理结果,这种代码风格被称为延续传递风格(Continuation Passing Style)。这里的回调函数(callback)被称为是延续(continuation),即这个回调函数决定了程序接下来的行为,整个程序的逻辑就是通过一个个的延续而拼接在一起。
状态机
img
引用:
1.https://www.jianshu.com/p/2979732fb6fb
2.https://blog.csdn.net/krossford/article/details/100145384
网友评论