昨天介紹了基本的異步處理概念,今天我們切入主題,說明一下 Kotlin 如何更精簡的處裡異步這件事。
所以當我們遇到要等待的函式時就可以將它切到其他執行序,讓程式主執行序繼續進行其他函式,然而這樣的切換並非沒有成本的,熟悉資訊領域的讀者不會對處理器在進行上下文轉換 (content switch) 需要把當前行程 (process) 的資料做備份然後載入要接續執行的行程;相同的,切換執行序執行也會有類似的成本。
Kotlin 實作的 coroutine 概念類似於異步多線程處理,但他更擅長處理資料庫數據讀寫、網路請求回應、系統 IO 處裡,對於一些相對吃重 CPU 運算的切換筆者這邊還是建議各位使用傳統的多執行序程式。接下來我們來講一下 coroutine 的撰寫吧!
Suspend 函式:首先我們會將需要等待的函式 (異不函式) 呼叫包在一個 suspend 函式內:
suspend fun fetchData(): String {
// 執行異步操作,例如網絡請求
// ...
return "成功獲取數據"
}
suspend
如其名說明代表著裡面的東西事需要暫停下來等它完成的,或是可以當作它是需要被暫停等待也可以。
Coroutine 建構器:coroutines 可以使用 launch
和 async
構建器。launch
用於啟動 “發送並忘記” 的任務,而 async
用於有需要 “返回結果” 時。
launch {
delay(1000L)
println(LocalDateTime.now()) // 開始後等一秒
delay(1000L)
println(LocalDateTime.now()) // 開始後等兩秒
}
Coroutine 作用域:我們必須在特定作用域內才能啟動 coroutine ,這些作用域內可以管理 coroutines 的生命周期。下面範例演示如果將上面我們把兩個 launch
分開撰寫它就會在 runBlocking
內前後被放下去一起等待一秒再顯示當下時間。
import kotlinx.coroutines.*
import java.time.LocalDateTime
fun main() = runBlocking {
launch {
delayN()
}
launch {
delayN()
}
println("Hello")
}
suspend fun delayN() {
delay(1000L)
println(LocalDateTime.now())
}
Hello
2023-10-11T13:41:25.052231676
2023-10-11T13:41:25.052746687