【发布时间】:2018-05-30 07:14:56
【问题描述】:
这两个术语似乎可以互换使用。然而,似乎也有一些差异,我正在努力解决。有区别吗?
【问题讨论】:
这两个术语似乎可以互换使用。然而,似乎也有一些差异,我正在努力解决。有区别吗?
【问题讨论】:
确实,这两者关系密切。要恢复一个协程,你实际上是调用continuation.resume()。
每个协程都有其关联的延续对象。实际上,除了那个对象,你不需要其他任何东西,它包含协程的完整状态。
在一定程度上,Kotlin 使用“协程”还包括协程上下文,这使协程知道如何准确地挂起自己,挂起时在哪里保持延续,以及以后如何恢复(调度)它。但是你也可以使用Unconfined协程上下文,它几乎和没有上下文一样好,并且完全控制恢复,只保留延续对象:
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlin.coroutines.Continuation
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
var continuation: Continuation<Unit>? = null
fun main(args: Array<String>) {
GlobalScope.launch(Dispatchers.Unconfined) {
println("Suspending")
suspendCoroutine<Unit> { cont ->
continuation = cont
}
println("Resumed!")
}
println("After launch")
continuation!!.resume(Unit)
println("After continuation.resume(Unit)")
}
在这里您可以看到我们重现了整个暂停-恢复场景,但只保留了 Continuation 对象。
我的结论是,由于 Kotlin 协程设计的特点(尤其是 stackless),“协程”和“延续”的概念之间的界限很模糊。
【讨论】:
Coroutine 类型的具体实例,或者Coroutine 的概念总是仅用Continuation 类型的实例(可以有多个?)具体表示?
Coroutine 类型甚至不存在。我们拥有的最接近的是AbstractCoroutine 及其各种子类。它主要对应一个Job,所以它是管理协程执行的对象。
协程是轮流执行其任务然后挂起以将控制权交给组中的其他协程并恢复任务的过程。
Continuation 是控制程序流程的堆栈,它允许它跳到程序的不同部分。您可以使用它来控制流程,包括像全局 switch 这样的协程。
【讨论】: