iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

昨天介紹了基本的異步處理概念,今天我們切入主題,說明一下 Kotlin 如何更精簡的處裡異步這件事。

https://ithelp.ithome.com.tw/upload/images/20231011/20119910WnZFIolJdv.jpg

所以當我們遇到要等待的函式時就可以將它切到其他執行序,讓程式主執行序繼續進行其他函式,然而這樣的切換並非沒有成本的,熟悉資訊領域的讀者不會對處理器在進行上下文轉換 (content switch) 需要把當前行程 (process) 的資料做備份然後載入要接續執行的行程;相同的,切換執行序執行也會有類似的成本。

Kotlin 實作的 coroutine 概念類似於異步多線程處理,但他更擅長處理資料庫數據讀寫、網路請求回應、系統 IO 處裡,對於一些相對吃重 CPU 運算的切換筆者這邊還是建議各位使用傳統的多執行序程式。接下來我們來講一下 coroutine 的撰寫吧!

  1. Suspend 函式:首先我們會將需要等待的函式 (異不函式) 呼叫包在一個 suspend 函式內:

    suspend fun fetchData(): String {
        // 執行異步操作,例如網絡請求
        // ...
        return "成功獲取數據"
    }
    

    suspend 如其名說明代表著裡面的東西事需要暫停下來等它完成的,或是可以當作它是需要被暫停等待也可以。

  2. Coroutine 建構器:coroutines 可以使用 launchasync 構建器。launch 用於啟動 “發送並忘記” 的任務,而 async 用於有需要 “返回結果” 時。

    launch {
            delay(1000L)
            println(LocalDateTime.now()) // 開始後等一秒
            delay(1000L)
    		println(LocalDateTime.now()) // 開始後等兩秒
    }
    
  3. 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
    

上一篇
Day 25 Kotlin Coroutine 先備知識
下一篇
Day 27 資料庫
系列文
成為一名 Kotlin 後端攻城獅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言