關于許多語言的異步編程模型狀態的一些著名文章指出,它們存在“顏色”問題,特別是將生態系統劃分為兩個獨立的世界:異步和非異步。以下是這種語言的屬性:
- 每個函式都有一種顏色,紅色或藍色(例如
async def) - 您呼叫函式的方式取決于它的顏色(例如
await) - 您只能從另一個紅色函式中呼叫紅色函式,
SyntaxError: 'await' outside async function - 紅色函式呼叫起來更痛苦(這個想法是,如果你決定將一個函式變成紅色,每個使用你的 API 的人都會想吐在你的咖啡里和/或在其中放入一些更不咸的液體)
- 一些核心庫函式是紅色的,所以你不能避免紅色函式
Kotlin 是一種非常新的語言,所以我想我應該研究一下它的異步模型。但是,Kotlin 會轉換為 JavaScript,所以我認為它比我認為的更具有顏色問題。但是它的協程對我來說有點難以理解并感到困惑,所以我在這里詢問Kotlin 的哪些屬性是正確的?(以及它解決了多少顏色問題)。
uj5u.com熱心網友回復:
- 每個函式都有一種顏色,紅色或藍色(例如 async def)
是的。
- 呼叫函式的方式取決于它的顏色(例如等待)
是的。
- 您只能從另一個紅色函式中呼叫紅色函式
是的。
- 一些核心庫函式是紅色的
是的,但他們可以幫助您處理紅色功能業務。您永遠不會被迫使用它們來獲得一些基本功能。
- 紅色函式呼叫起來更痛苦
也是如此,但有很多支持可以使疼痛降低。您可以在runBlocking { }任何地方使用“上升到紅色世界”,并且您只需撰寫suspend fun main(). Kotlin 的另一個不錯的選擇,在許多其他語言中都看不到,它的await-like 行為內置于函式本身中,您不必撰寫myFunction().await().
在實踐中,Kotlin 協程最痛苦的方面是它們無法從底層 API 中移除阻塞。例如,很容易使用 Java File IO,這是阻塞的,并使用同一執行緒凍結所有其他協程的進度。編譯器也很難確定您何時執行此操作,因此您很難找到它。
uj5u.com熱心網友回復:
我認為 Kotlin 掛起函式介于藍色和紅色之間。它們是同步呼叫的,非常容易使用,所以它們就像藍色一樣,但它們只能從其他掛起函式中輕松呼叫——如此紅色。
請注意,紅色函式被添加到語言中并非沒有原因。這個原因是性能。我們可以使用純藍色函式做任何事情,但它不會像使用紅色那樣快。
我認為 Kotlin 協程或其他語言中的類似解決方案最終可以解決顏色問題。不是全藍,而是相反:全紅。或者任何掛起功能真正是什么。如果我們保持整個代碼庫可掛起,那么我們就會獲得性能優勢,并且我們撰寫的代碼只是藍色的。
不幸的是,我認為在我們到達那里之前還需要很多時間。我們基本上需要打破與所有現有藍色庫的兼容性。這是昂貴的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318797.html
