pdf 深入理解kotlin协程_我写了一本书,《深入理解 Kotlin 协程》 | Bennyhuo

呜呜呜,昨天没有怎么看,来晚了。第三章是实战篇,直接看还是有点困难,我翻了翻源码。本章讲了如何实现简单的协程,我用自己方式整理一下。首先,我们可以从样本代码出发,协程是一个Continuation对像,通过resume方式恢复运行。SafeContinuation的resumeWith会对协程的状态检查并更新,成功后会传递结果给被代理的协程,即我们写的处理函数。第一次启动协程的时候,resume函数传递了一个Unit,作为协程的启动参数(这是无参类型的启动方式,通过设置类型为Unit来实现的)在启动的时候,检查当前状态,启用被代理的协程。

现在问题变成了createCoroutine是如何把两个协程合并成一个的,即我们现在被代理的对象。实际上就是简单的组合在了一起。里面实现了一个RestrictedContinuationImpl,启动方法invokeSuspend里面,在BaseContinuationImpl声明了运行流程,这里是我们的入口函数,负责拼接两个协程。到目前为止,我们发现协程和普通的函数似乎并没有太大的区别,里面有很多保证原子性和资源锁竞争的代码,保证了多线程情况下能够正确执行。

以上部分都和书上总结的一致。协程就是一个Continuation,个带context回调函数。

等等,为什么没看到任何异步的操作?协程不就是个带状态的函数吗,异步呢?benny做了解答:“异步调用是否发生,取决于resume函数与对应的挂起函数嗲用是否存在相同的调用栈上”。所以,现在我们已经有了包含状态的函数(类比future工具),剩下的就是什么时候用什么方式启动它了。

本章还有一个点,叫做拦截器。前面我们其实漏掉了一部分。之前生成的协程,是通过intercept函数,进行了一次异步包装。是拿到ContinuationInterceptor包装成DispatchedTask,是协程能够异步的基础,里面定义了异步需要的cancel等异步方法,而且内置一个dispatcher。其他的我还窥到了CoroutineStackFrame,看定义应该是一个异步调用栈。

回到书上介绍的,intercepter可以实现对continuation的拦截和释放,实现方式就是包装代理,异步的实现,也是通过代理让实际的协程在分发器中运行。这里有个有趣的点,在DispatchedTask中,协程和代理有一个相互代理的关系,他们是互相持有的。这里猜测下是用来做恢复的。

本章的内容感觉不多,但是对于不熟悉协程的人来说,比较生疏。呜呜呜,我好菜啊。希望各位大佬帮我指出问题,看我理解的对不对。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值