簡體   English   中英

Kotlin 協程與 Dart 中的 async-await 有何不同?

[英]How are Kotlin coroutines different from async-await in Dart?

Dart 使異步編程變得極其簡單。 您需要做的就是將異步代碼包圍在一個異步方法中,並在其中使用await在每次需要一段時間的調用之前。

我是 Kotlin 的新手,異步編程在這里似乎並不那么簡單。 (可能是因為 Dart 是單線程的。)

粗略地概括一下兩種語言在異步代碼的實現中提供的差異會很好。

如果我沒有陳述任何事實,請道歉。 提前致謝!

Dart 使異步編程變得極其簡單。 您需要做的就是將異步代碼包圍在一個async方法中,並在其中使用await在每次需要一段時間的調用之前。

是的(雖然async + await不是 Dart 的發明,但它至少可以追溯到 2012 年的 C# 5.0,然后直接啟發了 JavaScript、Python、Julia、Kotlin、Swift、RustDart)。

我是 Kotlin 的新手,異步編程在這里似乎並不那么簡單。

Kotlin 1.1async + await ,雖然await是一個后綴方法,不像大多數其他語言是一個運算符,但最終結果是一樣的。

粗略地概括一下兩種語言在異步代碼的實現中提供的差異會很好。

Kotlin 和 Dart 是不同的語言,因為它們解決了不同的問題,因此即使完全專注於它們如何處理並發和協程,也很難寫出它們的差異。


...但簡而言之,主要區別(就您而言)是語法上的(據我所知:請注意,我不是 Dart/Flutter 或 Kotlin 專家,我只知道如何閱讀文檔和使用谷歌)

我建議在 Kotlin 中查看一些簡單的示例,例如:


除了語法之外,最重要的區別是這些語言的多線程模型。

檢查這篇文章

Dart 使用 Isolates 支持多線程。 就在 Isolates 的介紹中,已經說過,isolates [是] 類似於線程但不共享內存,僅通過消息進行通信的獨立工作線程。

而 Kotlin(在 JVM 上)在底層使用Java 線程,這些線程可以訪問共享內存。


兩種語言中的async/await實現大致相同,使用CPS (美化回調)。 重要的區別是,在 Dart 中,您有單線程事件循環調度這些回調,而在 JVM 上的 Kotlin 中,您可以有多個事件調度一起工作,並且延續(回調)在不同線程上真正並行運行並共享內存,具有所有優點和由此產生的問題。

另外,請注意,Kotlin 的目標是成為一種多平台語言,因此在 JVM 上它具有多線程模型,如果將Kotlin 程序編譯到 JS 后端,它將是帶有事件循環的單線程,與 Dart 基本相同。


PS觀看來自 Roman Elizarov(Kotlin 協程設計師)的這段視頻,對協程的使用和內部結構有很好的概述。

我是 Kotlin 的新手,異步編程在這里似乎並不那么簡單。

事實上,Kotlin 將它提升到了一個簡單的水平:它幾乎是不可見的。 例如:

suspend fun main() {
    println("Hello")
    delay(1000)
    println("Hello again")
}

您不知道的這段代碼實際上是作為異步實現的。 但是您只會看到簡單的順序代碼。 編譯后的代碼(在 JVM 后端的情況下)具有如下結構:

public static void main(String[] args) {
    System.out.println("Hello");
    globalThreadPool.scheduleAfterDelay(() -> { 
        println("Hello again");
    }, 1000, TimeUnit.MILLISECONDS);
}

最重要的是,Kotlin 使適應您今天可能擁有的任何異步代碼變得非常簡單,以便您可以以與上述內置delay函數相同的本機方式使用。

人們最容易絆倒的不是這個基本場景,而是處理更高級的主題,如結構化並發、選擇正確的線程池來運行代碼、錯誤傳播等。

我沒有研究過 Dart,但根據我對其他語言中的 async-await 模式的了解,每當你調用一個async函數時,你就隱含地創建了一個並發任務,這個任務很容易泄漏——只需要忘記await它。 Kotlin 通過設計防止這些不良結果,並迫使您正面解決正在創建的並發問題,而不是從生產中解密內存不足日志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM