iT邦幫忙

2022 iThome 鐵人賽

DAY 12
0
Mobile Development

Kotlin 全面啟動 系列 第 12

[Kotlin 全面啟動] Coroutine

  • 分享至 

  • xImage
  •  

還記得昨天講 expect/actual 的時候提到了 Coroutine 嗎?作為 Kotlin 一個非常重要功能,今天我們就單獨拉一篇來介紹一下。 雖然說 Coroutine 不是個非常新的東西,但筆者認為理解它比使用它困難許多,每個人理解的 Coroutine 可能都不太一樣,以下就提出我自己的理解跟大家討論看看 Coroutine 是個棋盤、稿紙、還是綠豆糕?!

Structured Concurrency

要能理解 Coroutine 就要先了解 Structured Concurrency,甚至可以說 Coroutine 就是 Structured Concurrency 的一種具體實現。而什麼是 Structured Concurrency 呢?我們一個字一個字拆解。

首先,Concurrency 其實跟 Thread 的概念很像,在網路上看到一段敘述很棒如下:

Concurrency is about dealing with lots of things at once.
Parallelism is about doing lots of things at once.

所以 Concurrency 的重點在於處理很多個 task,然後透過不斷的 context switch 來切換模擬同時進行多件事情,這也是為什麼我們的 Coroutine 要使用 suspend 為關鍵字的一個原因,因為運行的 task 是真的會被 suspend 切到其他的 task 的。以下是截自官網的小範例:

fun main() = runBlocking { // this: CoroutineScope
    launch { // launch a new coroutine and continue
        delay(1000L) // non-blocking delay for 1 second (default time unit is ms)
        println("World!") // print after delay
    }
    println("Hello") // main coroutine continues while a previous one is delayed
}

我們可以先把 runBlocking 跟 launch 二個 block 視為二個 Coroutine,然後因為 launch 裡 delay 了一秒,所以外面的 Hello 會先執行,最後的輸出會變成:

Hello
World!

是不是跟 Thread 一樣蠻有趣且燒腦呢?

而 Structured Concurrency 的 Structure 呢,則是在 Concurrency 的概念之上再加上 scope 的概念,也就是綁定了一個生命週期的限制,一方面讓我們更好管理 Coroutine,同時也更不會發生 memory leak 等問題,這個 scope 在 Coroutine 就叫做 CoroutineScope,任何的 coroutine 都必須綁定在某個 CoroutineScope 下才能執行。像是一開始範例中的 launch 就是使用了 runBlocking 裡的 CoroutineScope,才能夠再建立一個 Coroutine 並執行。

Coroutine vs Thread

那這樣說起來 Thread 跟 Coroutine 的差別就只是一個有生命週期的保護,而另一個沒有嗎?大致上是但 Coroutine 還能做得更多,由於他不是一個真正的 Thread,所以比起 Thread 來說更輕量需要的資源更少,這邊從官網擷取一個有名的範例,一次建立十萬個 Coroutine 的程式代碼如下:

fun main() = runBlocking {
    repeat(100_000) { // launch a lot of coroutines
        launch {
            delay(5000L)
            print(".")
        }
    }
}

如果相同的 code 使用 Thread 來呼叫可能很容易就爆掉了,而且複雜的 task 如果需要在很多不同的 Thread 切換,使用 Coroutine 除了效能更好、易讀性也更高,甚至可以省略掉很多 callback hell,讓非同步的程式碼變成同步的呢,有興趣的話明天就讓我們一起看看 Coroutine 的更多指令,一起來體會它設計的美好囉~

JDK 19 已經開始有 Structure Concurrency 的支援囉,雖然說到普及應該還有一段時間,但可以感受得到 Structure Concurrency 的確是個潮流呢!


上一篇
[Kotlin 全面啟動] Expect & Actual
下一篇
[Kotlin 全面啟動] Coroutine II
系列文
Kotlin 全面啟動 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言