Dart 使異步編程變得極其簡單。您需要做的就是將異步代碼包圍在一個異步方法中,并在其中使用await在每次需要一段時間的呼叫之前。
我是 Kotlin 的新手,異步編程在這里似乎并不那么簡單。(可能是因為 Dart 是單執行緒的。)
粗略地概括一下兩種語言在異步代碼的實作中提供的差異會很好。
如果我沒有陳述任何事實,請道歉。提前致謝!
uj5u.com熱心網友回復:
我是 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 通過設計防止這些不良結果,并迫使您正面解決正在創建的并發問題,而不是從生產中解密記憶體不足日志。
uj5u.com熱心網友回復:
Dart 使異步編程變得極其簡單。您需要做的就是將異步代碼包含在一個
async方法中,并在await每次需要一段時間的呼叫之前使用。
是的(雖然async await不是 Dart 的發明,但它至少可以追溯到2012 年的 C# 5.0,然后它直接啟發了 JavaScript、Python、Julia、Kotlin、Swift、Rust 和許多其他人,以及Dart)。
我是 Kotlin 的新手,異步編程在這里似乎并不那么簡單。
Kotlin 1.1有async await,雖然await是后綴方法,不像大多數其他語言是運算子,但最終結果是一樣的。
粗略地概括一下兩種語言在異步代碼的實作中提供的差異會很好。
Kotlin 和 Dart 是不同的語言,因為它們解決了不同的問題,因此即使完全專注于它們如何處理并發和協程,也很難寫出它們的差異。
...但簡而言之,主要區別(就您而言)是語法上的(據我所知:請注意,我不是 Dart/Flutter 或 Kotlin 專家,我只知道如何閱讀檔案和使用谷歌)
我建議在 Kotlin 中查看一些簡單的示例,例如:
- 首先,閱讀
await介紹 Kotlin 1.1的公告:https : //kotlinlang.org/docs/whatsnew11.html#coroutines-experimental - 并在此處查看它如何與 Swift 的
asyncawait功能互操作:https : //kotlinlang.org/docs/whatsnew1530.html#experimental-interoperability-with-swift-5-5-async-await (Swift 的異步功能與 Dart 的作業方式相同,據我所知,除非沒有強制執行緒隔離) - Kotlin 協程異步等待序列
- 這篇文章(我只是略讀)似乎也不錯:https : //www.raywenderlich.com/books/kotlin-coroutines-by-tutorials/v2.0/chapters/5-async-await
uj5u.com熱心網友回復:
除了語法之外,最重要的區別是這些語言的多執行緒模型。
檢查這篇文章:
Dart 使用 Isolates 支持多執行緒。就在 Isolates 的介紹中,已經說過,isolates [是] 類似于執行緒但不共享記憶體,僅通過訊息進行通信的獨立作業執行緒。
而 Kotlin(在 JVM 上)在底層使用Java 執行緒,這些執行緒可以訪問共享記憶體。
async/await兩種語言的實作大致相同,使用CPS(美化回呼)。重要的區別是,在 Dart 中,您有單執行緒事件回圈調度這些回呼,而在 JVM 上的 Kotlin 中,您可以有多個事件調度一起作業,并且延續(回呼)在不同執行緒上真正并行運行并共享記憶體,具有所有優點和由此產生的問題。
另外,請注意,Kotlin 的目標是成為一種多平臺語言,因此在 JVM 上它具有多執行緒模型,如果將Kotlin 程式編譯到 JS 后端,它將是帶有事件回圈的單執行緒,與 Dart 基本相同。
PS觀看來自 Roman Elizarov(Kotlin 協程設計師)的這段視頻,對協程的使用和內部結構有很好的概述。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/360666.html
上一篇:Nodejs-并發或并行API呼叫在mongodb中創建重復條目
下一篇:如何從異步函式中異步運行代碼?
