pdf深⼊理解kotlin协程_我写了⼀本书,《深⼊理解Kotlin协
程》Bennyhuo
呜呜呜,昨天没有怎么看,来晚了。第三章是实战篇,直接看还是有点困难,我翻了翻源码。本章讲了如何实现简单的协程,我⽤⾃⼰⽅式整理⼀下。⾸先,我们可以从样本代码出发,协程是⼀个Continuation对像,通过resume⽅式恢复运⾏。SafeContinuation的resumeWith会对协程的状态检查并更新,成功后会传递结果给被代理的协程,即我们写的处理函数。第⼀次启动协程的时候,resume函数传递了⼀个Unit,作为协程的启动参数(这是⽆参类型的启动⽅式,通过设置类型为Unit来实现的)在启动的时候,检查当前状态,启⽤被代理的协程。
现在问题变成了createCoroutine是如何把两个协程合并成⼀个的,即我们现在被代理的对象。实际上就是简单的组合在了⼀起。⾥⾯实现了⼀个RestrictedContinuationImpl,启动⽅法invokeSuspend⾥⾯,在BaseContinuationImpl声明了运⾏流程,这⾥是我们的⼊⼝函数,负责拼接两个协程。到⽬前为⽌,我们发现协程和普通的函数似乎并没有太⼤的区别,⾥⾯有很多保证原⼦性和资源锁竞争的代码,保证了多线程情况下能够正确执⾏。
以上部分都和书上总结的⼀致。协程就是⼀个Continuation,个带context回调函数。
等等,为什么没看到任何异步的操作?协程不就是个带状态的函数吗,异步呢?benny做了解答:“异步调⽤是否发⽣,取决于resume函数与对应的挂起函数嗲⽤是否存在相同的调⽤栈上”。所以,现在我们已经有了包含状态的函数(类⽐future⼯具),剩下的就是什么时候⽤什么⽅式启动它了。kotlin多线程
本章还有⼀个点,叫做。前⾯我们其实漏掉了⼀部分。之前⽣成的协程,是通过intercept函数,进⾏了⼀次异步包装。是拿到ContinuationInterceptor包装成DispatchedTask,是协程能够异步的基础,⾥⾯定义了异步需要的cancel等异步⽅法,⽽且内置⼀个dispatcher。其他的我还窥到了CoroutineStackFrame,看定义应该是⼀个异步调⽤栈。
回到书上介绍的,intercepter可以实现对continuation的拦截和释放,实现⽅式就是包装代理,异步的实现,也是通过代理让实际的协程在分发器中运⾏。这⾥有个有趣的点,在DispatchedTask中,协程和代理有⼀个相互代理的关系,他们是互相持有的。这⾥猜测下是⽤来做恢复的。
本章的内容感觉不多,但是对于不熟悉协程的⼈来说,⽐较⽣疏。呜呜呜,我好菜啊。希望各位⼤佬帮我指出问题,看我理解的对不对。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。