21 | select:到底是在选择什么?
朱涛
你好,我是朱涛。今天我们来学习 Kotlin 协程的 select。
select,在目前的 Kotlin 1.6 当中,仍然是一个实验性的特性(Experimental)。但是,考虑到 select 具有较强的实用性,我决定还是来给你介绍一下它。
select 可以说是软件架构当中非常重要的一个组件,在很多业务场景下,select 与 Deferred、Channel 结合以后,在大大提升程序的响应速度的同时,还可以提高程序的灵活性、扩展性。
今天这节课,我会从 select 的使用角度着手,带你理解 select 的核心使用场景,之后也会通过源码帮你进一步分析 select API 的底层规律。学完这节课以后,你完全可以将 select 应用到自己的工作当中去。
好,接下来,我们就一起来学习 select 吧!
select 就是选择“更快的结果”
由于 select 的工作机制比较抽象,我们先来假设一个场景,看看 select 适用于什么样的场景。
客户端,想要查询一个商品的详情。目前有两个服务:缓存服务,速度快但信息可能是旧的;网络服务,速度慢但信息一定是最新的。
对于这个场景,如果让我们来实现其中的逻辑的话,我们非常轻松地就能实现类似这样的代码逻辑:
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
Kotlin协程的select是一个实验性特性,但在软件架构中具有重要作用。通过select,可以在多个挂起函数同时执行时,选择返回速度更快的结果,提高程序的响应速度和灵活性。文章通过比较传统的挂起函数串行执行和select并发执行的方式,展示了select的优势。通过示例代码,演示了如何使用select和async搭配实现并发执行和选择最快结果的功能,以及如何应对缓存服务出现问题的情况。同时,还展示了如何在多个缓存服务情况下,轻松扩展select的应用。总之,select不仅可以提升程序的整体响应速度,还可以提高程序的灵活性和扩展性。文章还介绍了select与Channel的搭配使用,以及如何处理Channel中的数据和异常情况。通过这些示例,读者可以快速了解select的用法和优势,以及如何在实际项目中应用select来提升程序性能和灵活性。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《朱涛 · Kotlin 编程第一课》,新⼈⾸单¥59
《朱涛 · Kotlin 编程第一课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(12)
- 最新
- 精选
- 白乾涛作为一个 Android 开发同学,我感觉协程没 Kotlin 基础语法香。 因为在 Android 中,异步任务没那么多,也没什么嵌套,只要稍加封装,用起来也没那么痛。 所以协程没想象中的那么实用。
作者回复: 你这么说也是有道理的,协程API有它的优势,但它的门槛太高了。
2022-03-1333 - 抱紧我的小鲤鱼不是很理解select的应用场景
作者回复: 其实就是:“多路复用”
2022-04-272 - 白乾涛所有的 onXX 都是回调 所有的异步都会用到回调
作者回复: 嗯,大概是这么个意思,但可以讲的更清楚一点哈。
2022-03-092 - L先生是不是类似于callback,包了一层,返回出去。内部可能每个包个async,然后谁先出数据就callback出去
作者回复: 很接近了。
2022-03-0721 - jim配合Channel使用感觉变复杂了
作者回复: select当然比单纯的Channel复杂,但需要级联多个Channel的场景下,其他手段一定会比select更复杂~
2022-04-02 - Paul Shan请问老师,是不是flow因为有了combine等操作符就不需要select了?
作者回复: 一方面是因为有了combine操作符,另一方面也是因为Flow有多种实现“冷的Flow”,“热的SharedFlow”等等,一个select已经很难兼顾这些实现了。
2022-03-24 - betteronXXX 表示回调的多,另外也可以表示会自动执行的方法(看个人习惯)。 感觉源代码难读,大概读了一下,发现有个注册回调的地方,当回调执行时,会判断一下 isSelected,如 select 已选择,则后续的就不走了。不知道对不对
作者回复: 嗯,差不多是这个流程。
2022-03-09 - 神秘嘉Bin是不是利用了onComplete和onStart进行计时,然后返回最快的一个?
作者回复: 思考的方向对了,其实本质上还是注册了回调。
2022-03-07 - Renext学习了
作者回复: 加油~
2022-03-07 - 瞌睡的李先生学过go语言的同学会感觉到这一篇真的特别好理解。学到现在感觉kotlin的协程有种集百家之长的感觉,对于多种语言背景的同学都可以方便地学习上手。2022-09-12归属地:浙江2
收起评论