校對:欣亦||排版:餘薇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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。