在Kotlin,Coroutine和Continuation之间的区别是什么?

时间:2018-05-30 07:14:56

标签: kotlin kotlin-coroutines

似乎这两个术语可以互换使用。然而,似乎还有一些不同之处,我正在努力指责。有区别吗?

2 个答案:

答案 0 :(得分:3)

协同程序是轮流执行任务然后暂停以控制组中其他协同程序并恢复任务的程序。

Continuation是控制程序流程的堆栈,允许它跳转到程序的不同部分。您可以使用它来控制流程,包括像全局switch一样的协程。

答案 1 :(得分:3)

确实,这两者密切相关。要恢复协程,您实际上是致电continuation.resume()

每个协程都有相关的延续对象。实际上,除了那个对象之外你不需要任何其他东西,它包含协程的完整状态。

在某种程度上,Kotlin使用“coroutine”还包括协程上下文,它为协程提供了如何准确暂停自身,在暂停时保持连续的位置,以及如何在以后恢复(发送)它的知识。但是你也可以使用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”和“continuation”的概念之间存在着模糊的界限。 / p>