首页>参考读物>计算机科学与技术>软件与程序设计

深入理解Kotlin协程
作者 : 霍丙乾 著
出版日期 : 2020-06-02
ISBN : 978-7-111-65591-6
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 236
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

内容简介
这是一部从工作机制、实现原理、应用场景、使用方法、实践技巧、标准库、框架、应用案例等多个维度全面讲解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平台对协程的支持情况,以及协程在这些平台上的应用。

图书特色

腾讯高级工程师、Kotlin布道师、Kotlin中文社区负责人撰写,全面剖析协程的概念和实现,提供了多种语言视角和丰富的案例,可供读者深入理解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等语言,大家不需要对这些语言有更多的认识和了解,只需了解它们的实现形式即可。
勘误和支持
我的水平有限,编写时间仓促,加之技术在不断更新和迭代,所以书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。
大家可以通过以下方式提供反馈。
关注微信公众号Kotlin,回复“Kotlin协程”,在收到消息的页面评论留言。
在本书主页https://www.bennyhuo.com/project/kotlin-coroutines.html评论留言。
本书主页会提供勘误表,我会在收到反馈后及时将问题整理补充到勘误表中,对于一些比较重要的问题也会专门通过公众号和我的个人网站提

供补充材料。
书中的全部源文件除可以从华章网站(www.hzbook.com)的本书页面下载外,也可以从

https://github.com/enbandari/DiveIntoKotlinCoroutines-Sources下载,我会根据相应的功能同步更新代码。如果你有更多的宝贵意见,

也欢迎发送邮件至邮箱yfc@hzbook.com,期待你的反馈。
致谢
感谢我的妻子,她是本书的第一位读者,也是第一位认真的校对者,感谢她在我遇到困难时开导和鼓励我,也感谢她在本书的整个写作过程中

给予我的陪伴和提出的改进建议。还要感谢我的父母和妹妹,是他们一如既往的支持,才让我在成长过程中敢于尝试和坚持,特别感谢他们容

忍我在短暂的春节假期里投入绝大多数的时间来完成书稿。
感谢腾讯地图数据采集研发团队与我并肩作战的战友们,是团队良好的技术氛围为我探索和尝试新技术提供了土壤,当然,也是他们对我很早

就在项目中“肆无忌惮”地使用Kotlin进行实践给予了足够的包容。
感谢Kotlin中文社区中每一位有趣的小伙伴,书中不少内容源自大家的切磋探讨,社区的小伙伴用实力为本书内容的组织提供了有力支持。
感谢机械工业出版社华章分社的策划编辑杨福川老师,是他在这半年多的时间里始终支持我写作,鼓励和帮助我顺利完成全部书稿。
谨以此书献给所有Kotlin开发者!

霍丙乾
2020年4月

上架指导

计算机\程序设计

封底文字

Kotlin包含很多现代高级语言的特性,Kotlin协程针对并发编程的痛点给出了解决方案。感谢丙乾能撰写一本关于协程的专著。这本书的内容不简单,但值得各位读者深入学习。
—— 邓凡平 资深Android技术专家 /“深入理解Android”系列丛书作者

在国内Kotlin的布道者中,“Bennyhuo”这个ID如雷贯耳。本书介绍了Kotlin协程在各个领域的实际应用,提供了很多工程应用上的思路。同时,本书更进一步讲解了协程背后的实现机制,以及不同语言协程之间的异同,是Kotlin编程进阶的必读书。
—— Jilen 《Kotlin核心编程》作者 / 水滴技术团队

霍老师是国内 Kotlin 编程的先驱,是首屈一指的 Kotlin 专家。本书内容由简入繁,搭配精练的图表,不仅介绍了理论,而且通过大量示例讲解了各种实战场景,一定能帮助读者深入理解Kotlin协程。不论你是Kotlin的初学者,还是已经有一定的Kotlin基础,如果想系统学习协程,这本大作绝对是必读经典。
—— 范圣佑 JetBrains技术布道师

本书作者是国内深入研究Kotlin的开发者之一,也是国内有影响力的Kotlin布道师,他的视频教程和原创文章都颇受欢迎。本书像作者之前的作品一样干货满满,更全面、更系统化,也更有深度,会引领读者深入理解协程乃至异步程序设计的用法、原理与编程思想。
—— 贾彦伟 Kotlin中文站负责人

作者简介

霍丙乾 著:英文书名:Understanding Kotlin Coroutine

(1)腾讯高级工程师、Kotlin布道师、Kotlin中文社区负责人撰写
(2)从工作机制、实现原理、应用场景、使用方法、实践技巧、标准库、框架等维度全面剖析协程,提供多种语言视角和丰富案例

图书目录

前言
第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.1.1 基于UI的异步问题分析 167
7.1.2 “鸡肋”的AsyncTask 169
7.1.3 “烫手”的回调 169
7.1.4 “救世”的RxJava 170
7.2 协程对UI的支持 173
7.2.1 UI调度器 173
7.2.2 协程版AutoDispose 174
7.2.3 Lifecycle的协程支持 176
7.3 常见框架的协程扩展 177
7.3.1 RxJava的扩展 177
7.3.2 异步组件ListenableFuture 179
7.3.3 ORM框架Room 180
7.3.4 图片加载框架coil 181
7.3.5 网络框架Retrofit 182
7.3.6 协程风格的对话框 183
7.4 本章小结 184
第8章 Kotlin协程在Web服务中的应用 185
8.1 多任务并发模型 185
8.1.1 多进程的服务模型 185
8.1.2 多线程的服务模型 186
8.1.3 事件驱动与异步I/O 186
8.2 协程在多任务模型中的运用 190
8.2.1 协程与异步I/O 191
8.2.2 协程与“轻量级线程” 192
8.3 常见Web应用框架的协程扩展 193
8.3.1 Spring的响应式支持 193
8.3.2 Vert.x 196
8.3.3 Ktor 199
8.4 本章小结 203
第9章 Kotlin协程在其他平台上的应用 204
9.1 Kotlin-Js 204
9.1.1 Kotlin-Js概述 205
9.1.2 Kotlin-Js上的协程 209
9.2 Kotlin-Native 212
9.2.1 Kotlin-Native概述 212
9.2.2 Kotlin-Native的协程支持 218
9.3 本章小结 221

教学资源推荐
作者: (美)Maurice Herlihy 布朗大学 Nir Shavit 麻省理工学院 著
作者: 刘艺 等
作者: 朱鸣华 罗晓芳 董明 孟军 汪德刚 编著
作者: 钱晓捷 编著
参考读物推荐