猜你喜欢
深入理解Kotlin协程

深入理解Kotlin协程

书籍作者:霍丙乾 ISBN:9787111655916
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:4870
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

这是一部从工作机制、实现原理、应用场景、使用方法、实践技巧、标准库、框架、应用案例等多个维度全面讲解Kotlin协程的专著,它同时提供了多语言视角,亦可通过本书了解其他语言的协程。

本书作者是腾讯的的高级工程师,是国内Kotlin领域的先驱者和布道者,不仅在工程实践领域积累了丰富的经验,而且在Kotlin开发者社群里有广泛的影响力和号召力。

【全书共9章】:

●第1章从协程的核心应用场景——异步程序设计的思路和关键问题切入,引出Kotlin协程的概念;

●第2章首先介绍了协程的概念、分类,然后讲解了Python、Lua、Go等不同语言的协程实现和对比;

●第3~4章以 Kotlin 标准库的协程 API 为核心,讲解了简单协程的使用方法和运行机制,以及通过简单协程设计和实现复合协程的思路和方法;

●第5~6章以Kotlin的官方协程框架为模板,通过逐步实现其中的核心功能,分析了其中的实现细节和复合协程的运行机制,并对框架的使用做了深入探讨;

●第7~8章讲解了协程在Android应用开发和Web服务开发中的应用场景、面临的挑战,以及解决各种常见问题的方法和思路;

●第9章探讨了JavaScript 和 Native等非JVM平台对协程的支持情况,以及协程在这些平台上的应用。


作者简介

霍丙乾(Bennyhuo)

毕业于北京邮电大学,现任腾讯地图数据采集研发中心团队移动客户端技术负责人。

资深Kotlin技术专家,国内知名的Kotlin开发者和布道师。

2016年10月创建微信公众号Kotlin,持续发布Kotlin相关的文章和教学视频,颇受欢迎。

2017年初开始参与Kotlin中文相关网站的翻译和维护至今。


编辑推荐
适读人群 :本书适合所有的有 Java 并发开发经验并有良好 Kotlin 基础的读者阅读。

(1)作者是腾讯的高级工程师,是Kotlin领域的先驱者、知名布道师、Kotlin领域的网红级专家

(2)本书从工作机制、实现原理、应用场景、使用方法、实践技巧、标准库、框架、应用案例等8个维度对Kotlin协程进行了全面讲解,提供多种语言视角和丰富案例


前言

【为什么要写这本书】

我应该算是国内比较早接触和使用Kotlin的开发者了。

知道这门语言完全是个偶然。当时我还在阿里巴巴实习,周末没事去公司蹭吃蹭喝蹭电脑,编译了Hotspot源码觉得还不过瘾,又开始编译IntelliJ IDEA的社区版。

某天下午我遇到件烦心事,编译并不是很顺利。我发现有一种没见过的后缀为kt的文件,顿时感到压力倍增,Groovy和Scala我还没学会呢,怎么又来一个!不过,当时我只是按照说明把Kotlin的环境搭建好,并没有继续理会这门还处在v0.8的语言。

毕业之后我就职于腾讯地图,得益于团队良好的技术氛围以及对新人的鼓励和信任,入职第一年就能有机会负责重构地图SDK,后来为团队贡献了不少公共组件。整个过程中我既充分感受到了Java的魅力,也发现了它在开发效率上的不足。于是我试着用Groovy、Scala甚至Python来开发Android,但都不太理想,最后想起JetBrains家的“小儿子”Kotlin,结果就一发不可收拾。

Lambda,我所欲也;扩展函数,亦我所欲也。二者居然可兼得。后来我的业余时间也从研究“茴香豆的‘茴’有几种写法”变成了研究“这段Java代码用Kotlin能怎么简化”。可是,当时身边的同事和同行似乎并没有对Java感到疲惫,于是我又开始试着录视频、写文章,最终走上了Kotlin的布道之路。

幸运的是,Kotlin在2017年的Google I/O大会上被提为Android开发的一级语言,这着实让它火了一把。那时候绝大多数Android工程师可能都没有听说过这门语言,它有何德何能竟会受到Google的青睐?

当时,我和几个天天因Kotlin的特性而相互“口诛笔伐”的群友们聚到一起,考虑是否要写本书—大家也许需要这样一本书来了解Kotlin。不过,这本书因写作时间很长,耗尽了大家的热情,我们尚未定稿,国内其他Kotlin入门书已陆续面世。至于我负责的协程部分,从协程还是个“宝宝”开始,先后重写了三次,现在的Kotlin协程俨然是一位“大叔”了。

2019年,机械工业出版社的杨福川老师找到我,问我要不要写点什么。我想,Kotlin协程现在仍然是一个很大的麻烦,国内外都没有很好的资料,官方文档又过于精练,不太适合大家入门和进阶。于是就有了这本书。

Kotlin协程不像Python、JavaScript的async/await那样容易上手,后者似乎根本不需要明白什么是协程就能轻松使用。

我曾试着从Kotlin协程的标准库API开始讲—这样的好处是大家能够打好基础,结果大多数读者反馈这样不易学习。于是在“破解Kotlin协程”系列文章中,我从一开始就基于Kotlin项目组提供的协程框架开始介绍,并对比RxJava从实际问题切入,读者反映这可能是最通俗易懂的协程文章了。不过很快,在介绍到调度器和挂起原理等内容的时候,读者就开始叫苦了,反馈说读起来如同天书一般。

当然,这其中也不乏感觉良好的读者,他们期望我能系统地对比一下Kotlin与其他语言的协程实现的异同,这说明这部分内容本身不是问题,问题可能是铺垫做得不足。于是我仔细分析了读者反馈的问题,发现多数问题源自大家对于协程概念理解的偏差。因此在本书中,我从一开始就紧紧抓住概念问题,从各个角度去阐释什么是协程,以及Kotlin协程与其他常见语言的协程在实现上有何区别。在探讨概念的时候,我尽可能用实际问题引入,逐步给出解决思路,由简入繁,将协程的设计思路和实现细节尽可能地呈现出来。

还有朋友建议我在文章中多提供一些图表以方便理解,为此我在本书中为所有关键节点提供了相应的状态图、时序图等,希望能够帮助读者轻松理解探讨的内容。

【读者对象】

本书适用于有一定基础的Kotlin开发者,包括但不限于正在使用和希望使用Kotlin开发Android、Web服务、iOS、前端等应用的开发者。

本书不会讲解Kotlin的基础语法,因此建议Kotlin初学者先阅读基础书,《Kotlin核心编程》就是一个不错的选择。你也可以访问https://coding.imooc.com/class/398.html参考我在慕课网发布的“Kotlin入门到精通”视频课程,视频中详细讲解了Kotlin的基础与进阶知识,其中的协程部分可以与本书配套学习。

【本书特色】

Kotlin协程背后的知识点非常多,本书从异步程序的设计入手,探讨异步程序设计中要面对的关键问题,并在之后围绕这几个关键问题对Kotlin协程的设计实现展开探讨。

在剖析Kotlin协程的过程中,本书除介绍API的基本用法以外,还提供了使用Kotlin协程设计实现各类复合协程API的思路和方法,并抽象出一套系统的设计思路,通过CoroutineLite这个项目的设计实现,帮助大家深入了解官方协程框架的内部运行机制。

在帮助读者掌握Kotlin协程内部原理的同时,本书还从Android、Web应用和多平台等角度提供了实践思路,帮助读者做到在原理上深入浅出,在实战中融会贯通。

为了方便内容的展开,在探讨的过程中本书也对一些概念明确进行了定义和归纳,例如简单协程、复合协程、协程体等。

本书包含了丰富的示例,以便于读者阅读参考。

为提升读者的阅读体验,本书所有代码均采用JetBrains Mono字体,该字体由Kotlin项目团队所属公司JetBrains为开发者专门打造,更适合代码的阅读。

【如何阅读这本书】

本书基于撰写时的最新Kotlin v1.3.61来讲解Kotlin协程的基本概念、实现原理和实践技巧。全书共9章,具体内容如下。

第1章主要从程序设计出发,结合实际问题引出异步程序的设计方案。异步程序的设计和实现是本书探讨的协程的基本应用场景,也是本书内容的基石。

第2章主要从协程本身切入,剖析协程是什么、有哪些类别,以及不同语言的协程实现有何种区别和联系等。这一章内容是理解Kotlin协程概念的前提。

第3章主要以Kotlin标准库的协程API为核心,阐述简单协程的使用方法和运行机制。简单协程是复合协程的基础,掌握这部分内容是理解协程工作机制的关键。

第4章主要介绍运用Kotlin协程的基础设施设计和实现复合协程的思路和方法,为后续对官方协程框架的学习和运用奠定基础。

第5章以官方协程框架为模板,介绍如何逐步实现其中的核心功能,以帮助读者了解其中的实现细节,并对复合协程的运行机制做到心中有数。这部分内容也是对前几章所述基础知识进行灵活运用的体现。

第6章介绍官方协程框架的运用,重点探讨了Channel、Flow、select的使用场景。至此,我们就已经掌握了将协程运用到实践中的基本技能。

第7章主要探讨协程在以Android为例的UI应用程序开发环境中面临的挑战和解决问题的方法,重点介绍了协程与Android生命周期的结合、协程与RxJava的互调用,以及Retrofit、Room等框架对协程的支持。

第8章主要探讨协程在Web服务开发场景中的运用,重点给出了基于Spring、Vert.x、Ktor这几个框架运用协程解决异步问题的方法和思路。

第9章主要介绍在除JVM以外的JavaScript和Native平台上,Kotlin协程的应用情况。

整体看来,第1~3章侧重于概念的介绍,第4章和第5章侧重于介绍如何将简单协程封装成复合协程,第6章介绍官方框架所提供的复合协程的使用方法,第7~9章侧重于实战运用。

建议对协程不了解的读者从前到后循序渐进地阅读本书。如果对协程有一定的认识,包括有在Lua、Go、JavaScript等语言中使用协程解决异步问题的经验,可以尝试从第6章开始阅读,在遇到不清楚的地方时再有目的地查阅前面的内容。如果想要快速体验协程的魅力,也可以直接从第7章开始挑选自己感兴趣的内容阅读,但全面了解协程的运行机制和原理仍然非常必要。

另外需要说明的是,本书在第2章介绍协程的概念时横向对比了几类典型的协程实现,在第4章中会使用Kotlin仿照这些协程的实现风格给出对应的复合协程实现,这其中涉及Lua、JavaScript、Go等语言,大家不需要对这些语言有更多的认识和了解,只需了解它们的实现形式即可。


目录

●前言

●第1章 异步程序设计介绍 1

1.1 异步的概念 1

1.1.1 程序的执行 1

1.1.2 异步与回调 2

1.1.3 回调地狱 3

1.2 异步程序设计的关键问题 4

1.2.1 结果传递 4

1.2.2 异常处理 6

1.2.3 取消响应 8

1.2.4 复杂分支 9

1.3 常见异步程序设计思路 10

1.3.1 Future 11

1.3.2 CompletableFuture 11

1.3.3 Promise与async/await 13

1.3.4 响应式编程 15

1.3.5 Kotlin协程 15

1.4 本章小结 17

●第2章 协程的基本概念 18

2.1 协程究竟是什么 18

2.2 协程的分类 20

2.2.1 按调用栈分类 20

2.2.2 按调度方式分类 22

2.3 协程的实现举例 22

2.3.1 Python的Generator 23

2.3.2 Lua标准库的协程实现 24

2.3.3 Go的go routine 27

2.4 本章小结 30

●第3章 Kotlin协程的基础设施 31

3.1 协程的构造 31

3.1.1 协程的创建 32

3.1.2 协程的启动 32

3.1.3 协程体的Receiver 34

3.1.4 可挂起的main函数 36

3.2 函数的挂起 37

3.2.1 挂起函数 37

3.2.2 挂起点 38

3.2.3 CPS变换 39

3.3 协程的上下文 41

3.3.1 协程上下文的集合特征 41

3.3.2 协程上下文元素的实现 42

3.3.3 协程上下文的使用 43

3.4 协程的拦截器 45

3.4.1 拦截的位置 45

3.4.2 拦截器的使用 46

3.4.3 拦截器的执行细节 47

3.5 Kotlin协程所属的类别 48

3.5.1 调用栈的广义和狭义 48

3.5.2 调度关系的对立与统一 49

3.6 本章小结 50

●第4章 Kotlin协程的拓展实践 51

4.1 序列生成器 51

4.1.1 仿Python的Generator实现 52

4.1.2 标准库的序列生成器介绍 56

4.2 Promise模型 57

4.2.1 async/await与suspend的设计对比 58

4.2.2 仿JavaScript的async/await实现 59

4.3 Lua风格的协程API 61

4.3.1 非对称API实现 61

4.3.2 对称API实现 67

4.4 再谈协程的概念 72

4.4.1 简单协程与复合协程 73

4.4.2 复合协程的实现模式 73

4.5 本章小结 74

●第5章 Kotlin协程框架开发初探 75

5.1 开胃菜:实现一个delay函数 75

5.2 协程的描述 77

5.2.1 协程的描述类 78

5.2.2 协程的状态 79

5.2.3 支持回调的状态 80

5.2.4 协程的初步实现 83

5.3 协程的创建 84

5.3.1 无返回值的launch 84

5.3.2 实现invokeOnCompletion 85

5.3.3 实现join 89

5.3.4 有返回值的async 90

5.4 协程的调度 92

5.4.1 协程的执行调度 92

5.4.2 协程的调度位置 93

5.4.3 协程的调度器设计 93

5.4.4 基于线程池的调度器 94

5.4.5 基于UI事件循环的调度器 96

5.4.6 为协程添加默认调度器 97

5.5 协程的取消 98

5.5.1 完善协程的取消逻辑 98

5.5.2 支持取消的挂起函数 100

5.5.3 CancellableContinuation的实现 103

5.5.4 改造挂起函数 106

5.6 协程的异常处理 109

5.6.1 定义异常处理器 110

5.6.2 处理协程的未捕获异常 111

5.6.3 区别对待取消异常 111

5.6.4 异常处理器的运用 113

5.7 协程的作用域 113

5.7.1 作用域的概念 113

5.7.2 作用域的声明 114

5.7.3 建立父子关系 116

5.7.4 顶级作用域 116

5.7.5 协同作用域 117

5.7.6 suspend fun main的作用域 119

5.7.7 实现异常的传播 120

5.7.8 主从作用域 121

5.7.9 完整的异常处理流程 122

5.7.10 父协程等待子协程完成 122

5.8 本章小结 123

●第6章 Kotlin协程的官方框架 124

6.1 协程框架概述 124

6.1.1 框架的构成 124

6.1.2 协程的启动模式 126

6.1.3 协程的调度器 127

6.1.4 协程的全局异常处理器 129

6.1.5 协程的取消检查 130

6.1.6 协程的超时取消 132

6.1.7 禁止取消 133

6.2 热数据通道Channel 134

6.2.1 认识Channel 134

6.2.2 Channel的容量 136

6.2.3 迭代Channel 138

6.2.4 produce和actor 138

6.2.5 Channel的关闭 140

6.2.6 BroadcastChannel 142

6.2.7 Channel版本的序列生成器 144

6.2.8 Channel的内部结构 146

6.3 冷数据流Flow 148

6.3.1 认识Flow 149

6.3.2 对比RxJava的线程切换 150

6.3.3 冷数据流 151

6.3.4 异常处理 151

6.3.5 末端操作符 153

6.3.6 分离Flow的消费和触发 153

6.3.7 Flow的取消 154

6.3.8 其他Flow的创建方式 155

6.3.9 Flow的背压 155

6.3.10 Flow的变换 157

6.4 多路复用select 158

6.4.1 复用多个await 158

6.4.2 复用多个Channel 160

6.4.3 SelectClause 161

6.4.4 使用Flow实现多路复用 161

6.5 并发安全 163

6.5.1 不安全的并发访问 163

6.5.2 协程的并发工具 164

6.5.3 避免访问外部可变状态 165

6.6 本章小结 166

●第7章 Kotlin协程在Android上的应用 167

7.1 Android上的异步问题 167

7.2 协程对UI的支持 173

7.3 常见框架的协程扩展 177

7.4 本章小结 184

●第8章 Kotlin协程在Web服务中的应用 185

8.1 多任务并发模型 185

8.2 协程在多任务模型中的运用 190

8.3 常见Web应用框架的协程扩展 193

8.4 本章小结 203

●第9章 Kotlin协程在其他平台上的应用 204

9.1 Kotlin-Js 204

9.2 Kotlin-Native 212

9.3 本章小结 221


短评

kotlin进阶必备读本!

2020-06-29

标签
kotlin
产品特色