详解 kotlin 对 coroutines (1)

zidea · · 1006 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

今天有以前同事问我如何应对高并发,java 通常的方案是线程池。不过线程池是有瓶颈的,而且成本高。这个是阿里巴巴架构师在分享中说到的。现在的解决方案是协程,协程好处多多,从表面上我们告别了通过回调来处理异步,回调写起来一层套一层,我们通常叫做倒三角形。

上面的代码,也是在 web 应用常见,我们拿到 token ,然后用 token 来创建一个 post 请求,最后处理我们返回数据。这里有两个异步,拿 token , 用 token 和 item 发起请求来获取我们所需的数据。

direct style 就是顺序执行代码,当 requestToken 结束后再执行 createPost。就这样执行下去。这样执行下去,虽然效率不高但符合我们思考习惯,代码看上去工整便于理解。

我们介绍一下 CPS (Continuation-Pass Style) ,那么什么是 CPS 从字面上理解就是链式地执行。

其实可能我们这里说 CPS 大家感觉陌生,而且感觉有那么点高大尚,其实他就是我们平时 javascript 的回调。所以再遇到有人提及 CPS 时,你的脑海里就可以把他替换为 Callback 来思考就行了。

我们知道在 kotlin 中在函数 fun 前加上 suspend 他就变成了协程,这里叫做 coroutines direct style。最开始接触 coroutine 还是在学习 golang 的时候接触到这个概念。golang 正是因此而著名,因为有了 coroutine ,golang 就可以轻松地处理高并发。

好有了一些了解,我们看一看在 kotlin 中是如何实现 coroutine 的。了解 kotlin 的 coroutine 实现的背后原理,不但我们更好实现 coroutine。也可以将其实现在其他语言中。问题的关键是我们如何将 顺序执行转换为 CPS 的。

其实我们添加 suspend 给 fun 后,在编译过程中,编译器对我们函数进行了特殊处理,以便达到 coroutine 效果。 

我们看一看当函数来到 JVM 他就变成上图的样子,在原有两个参数后面有多了一个参数,而且这个参数包含 POST,看一看有点类似我们在 js 时后面的回调。

其实 Continuation 是一个接口,首先有一个 Context, 有关 context 的用途我随后给大家介绍。下面 resume 和 resumeWithException 大家可能有点眼熟,类似回调函数的 success 和 fail 。好今天到这里待续吧。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:zidea

查看原文:详解 kotlin 对 coroutines (1)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

1006 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传