【发布时间】:2018-04-02 12:59:45
【问题描述】:
Kotlin 协程是有限状态机和一些任务运行器的糖(例如,默认的 ForkJoinPool)。 https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#implementation-details
换句话说,在 java/kotlin 运行时中还没有运行时协程(但这可以通过 http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html 改变)。 Kotlin 协程只是一系列任务,一个一个地执行。每个任务都可以在线程池中的任意线程中执行。
Go 运行时支持“协程”。但是 goroutines 并不是真正的协程。 Goroutines 不允许在程序中设置屈服点。此外,Go 不允许设置自定义线程池。您可以只设置默认池中的线程大小。
kotlin 协程和 goroutines 的第一个区别是 Go 运行时管理此时正在运行的协程。当 goroutine 在某些 IO 操作(或同步原语)处被阻塞时,Go 会选择下一个 Job 来执行它。在 JVM 中,不存在这样的智能工作切换。
因此,Go 可以廉价地更改当前正在运行的作业。 Go 只需要更改几个注册表 https://groups.google.com/forum/#!msg/golang-nuts/j51G7ieoKh4/wxNaKkFEfvcJ。但是有人说,JVM 可以使用线程堆栈而不是寄存器。所以根本不需要保存和加载寄存器。
kotlin 协程和 goroutine 的第二个区别是协程的类型。 Kotlin 协程是无堆栈协程。 Goroutines 是堆栈式协程。 Kotlin 协程的所有状态都存储在 Kotlin 上下文中,该上下文存储在堆中。 Goroutines 状态存储在寄存器和线程堆栈中。
我想知道,哪些协程(goroutines 和 kotlin 协程)在 IO 绑定任务中更快? CPU绑定任务?内存消耗呢?
【问题讨论】:
-
“stackful coroutines”和“stackless coroutines”之间的区别是不明确且没有实际意义的。有关详细信息,请参阅我的 JVMLS 演讲:youtube.com/watch?v=3xalVUY69Ok
标签: go kotlin coroutine goroutine kotlin-coroutines