Kotlin corutines是有限狀態機和一些任務運行器的糖(例如,默認的ForkJoinPool)。 https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#implementation-details哪個協程(goroutines和kotlin協程)更快?
換句話說,java/kotlin運行時中沒有運行時協同程序(但可以通過http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html更改)。 Kotlin協同程序只是順序執行的任務,它們被逐一執行。每個任務都可以在線程池中的任何線程中執行。
Go運行時支持「協同程序」。但是goroutines不是真正的協程。 Goroutines不允許在程序中設置屈服點。另外,Go不允許設置自定義線程池。您只能在默認池中設置線程的大小。
kotlin協程和goroutines之間的第一個區別是Go運行時管理此時正在運行的協程。當某個IO操作(或同步原語)阻塞了goroutine時,選擇下一個作業執行它。在JVM中,這種條件下沒有智能工作轉換。
因此,Go可以便宜地更改當前正在運行的作業。 Go只需要更改一些註冊表https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ。但有人說,JVM可以使用堆棧線程而不是使用寄存器。所以根本沒有保存和加載寄存器。
kotlin協程和goroutines之間的第二個區別是協程類型。 Kotlin協程是無堆棧協程。 Goroutines是堆棧協程。 Kotlin協同程序的所有狀態都存儲在Kotlin環境中,並存儲在堆中。 Goroutines狀態存儲在寄存器和線程堆棧中。
我想知道哪些協程(goroutines和kotlin協程)在IO綁定任務中更快? CPU綁定任務?內存消耗如何?
「堆棧協程」和「無堆棧協程」之間的區別是不明確的,沒有實際意義。有關詳細信息,請參閱我的JVMLS講座:https://www.youtube.com/watch?v=3xalVUY69Ok –