校对:欣亦||排版:余薇java
Kotlin 协程如今愈来愈成熟,也已经很是适合运用于生产环境当中,但对于Kotlin协程设计,你是否也有一些困惑呢?linux
在刚刚结束的Android 11 Meetup第二期直播中,经过腾讯地图平台部高级工程师,Kotlin布道师、Kotlin中文社区负责人,《深刻理解Kotlin协程》做者,慕课网《Kotlin入门到精通》讲师霍丙乾,为你们带来的精彩分享《Kotlin协程的那些事儿》,你或许有所收获。web
错过直播的小伙伴别着急,小编已经整理出详尽回顾内容,点击文末【阅读原文】,还能够获取直播回放哦~编程
嘉宾分享windows
1.协程究竟是什么安全
协程究竟是什么?通常来讲你们遇到这个问题的话怎么办?先去维基百科上面去搜一下什么叫协程?维基百科上面的答案给出来,你们看完了以后保证仍是看不懂。服务器
协程的做用
微信
一、协程可让异步代码同步化,下降异步程序的设计复杂度并发
怎么办?CPU执行权到底要怎么分配呢?其实就想出了比较直接的两个方案,线程的话就是把CPU的执行的时间分红片,时间片用完了以后,根据必定的策略,好比说抢占式调度,若是一个线程可能执行须要5秒钟,那么一次执行我只给你100毫秒,执行完了以后把执行权交出来给别人执行。
二、协程能够实现轻量级的并发,提升系统资源的利用率app
协程的演进
2.为何大多数开发者以为协程学起来很难?
3.Kotlin协程的设计比其余语言的复杂,为何?
如今比较流行都是无栈协程,好比说async/await,好比kotlin当中的suspend这种,其实咱们均可以认为它是无栈协程,由于他没有专门去开辟一块内存的空间来保存它的调用栈,可是Go routine 是有调用栈的。Go routine这块优化很是的好,它调用栈通常来讲就是4kb,并且能够动态地局部地调整。在程序运行的时候,它的内存分布有一个栈区和一个堆区,注意调用栈跟栈区不是一回事儿。一般来讲,咱们的调用栈是分配在栈区上的,可是Go routine它的调用栈是分配的堆区,它就能够自动的去扩容跟缩容。
4.Kotlin协程为何能够简化异步逻辑的写法?
• 异步任务就是调用流程的切换
• 协程的协做性可以使得异步触发点和返回点“拼接”起来
@GET("users/{login}")suspend fun getUser(@Path("login") login: String): User
5.为何说Kotlin的协程比线程轻量?
为何线程比较重?线程自打一出生他就会有一个调用栈,那这个栈到底要占多少内存,咱们看一下:
而Kotlin协程的内存开销有多大呢?按照调用栈的定义,其实kotlin协程的实现应该算是一个无栈的协程。有人专门作过一个统计,经过launch启动一个协程只占几十字节的内存。几百kb是什么概念?一兆至关于1024个Kb,1024个kb再乘10就是至关于一万倍差,若是协程跟线程同时能解决的问题,用线程去解决的话,确定是比协程要重得多。
6.Kotlin协程究竟怎么学?
Q&A环节
Q1.若是存在多个协程并行,其中一个出让执行权后,哪个协程会接收执行权?是如何判断的?
A:咱们刚才提到过,协程能够分为有栈和无栈,其实协程的分类还有一个维度,叫作对称和非对称式的调度。对称的调度就是意味着全部的协程都是对等的,好比Go routine,当其中一个协程出让执行权的时候,谁来接收就取决于你中间的桥梁,好比我向Channel里面写数据,哪一个协程来读这个数据,就去接受这个调度权。对于非对称调度,好比说a调用b,就像一个函数调用同样,那么b在返回执行权的时候,就像函数返回同样,谁调用的你就返回给谁。因此,多个协程的调度,彻底取决于你的设计以及调动的方式。首先判断是对称的仍是非对称的,若是是非对称的话,谁调用你,你返回的时候就谁来接受。那么在kotlin当中它其实是属于非对称式的调度,固然咱们也能够经过kotlin协程的API来实现对称式协程的效果,在《深刻理解kotlin协程》那本书的源码里边能够找到更为具体的解答。
Q2.协程抛异常外层能catch到吗?
A:协程抛异常其实是协程自己对异常处理的逻辑。在kotlin当中,对异常的处理要根据异常处理器Exception Handler的设置和跟做用域的关系,来判断到底能不能捕获到外层,捕获时还须要看你对外层的定义,好比说,在一个协程外面启动了另外一个协程,而后又调用了join,若是协程里边抛了异常,要想捕获join,其实须要不少条件,好比里边的协程跟外边的协程是否是同一个做用域,或者说里边协程是否是supervisor scope等等。因此异常的捕获首先取决于外层的定义,第二个就是如何样去捕获它,再一个就是所谓的做用域的关系,以及你有没有设置Exception Handler,这些都是会影响到你能不能捕获到的。我以为提问题的这位开发者能够去看一下书里边的介绍,或者说阅读官方文档就能够了。
学习渠道
Kotlin公众号
GDG公众号
推荐书籍《深刻理解Kotlin协程》
推荐书籍《Kotlin编程实战》
kotlin 协程官方文档和相关源码
慕课“从入门到精通”
直接阅读源码
Kotlin 官方协程框架源码:kotlinx.coroutines
Kotlin 官方协程框架简化仿写版:CoroutineLite
《深刻理解 Kotlin 协程》源码:DiveIntoKotlinCoroutines-Sources
其余资源
• 官网:http://kotlinlang.org/
• 官网(中文):https://www.kotlincn.net/
• 博客:https://blog.jetbrains.com/kotlin
• 博客(中文):https://www.kotliner.cn/
• 论坛:https://discuss.kotlinlang.org/
• 论坛(中文):https://discuss.kotliner.cn/
Google Developer Groups 谷歌开发者社区,是谷歌开发者部门发起的全球项目,面向对 Google 和开源技术感兴趣的人群而存在的公益性开发者社区。GDG Shanghai 创立于 2009 年,是全球 GDG 社区中最活跃和知名的技术社区之一,每一年举办 30 – 50 场大大小小的科技活动,每一年影响十几万以上海为中心辐射长三角地带的开发者及科技从业人员。
社区中的各位组织者均是来自各个行业有着本职工做的互联网从业者,咱们须要更多新鲜血液的加入!若是你对谷歌技术感兴趣,业余时间可调配,认同社区的价值观,愿意为社区作出贡献,欢迎加入咱们成为社区志愿者!
志愿者加入方式:关注上海 GDG 公众号:GDG_Shanghai,回复:志愿者。
社区成员加入方式:请发邮件至如下邮箱
gdg-shanghai+subscribe@googlegroups.com
本文分享自微信公众号 - GDG(GDG_Shanghai)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。