在Kotlin中,“协程”和“延续”这两个词有什么区别?

Jul*_* A. 5 kotlin kotlin-coroutines

似乎这两个术语可以互换使用。但是,我似乎仍在努力努力,似乎也存在一些差异。有区别吗?

Mar*_*nik 5

的确,这两个是密切相关的。要恢复协程,您实际上致电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)")
}
Run Code Online (Sandbox Code Playgroud)

在这里,您可以看到我们重现了整个suspend-resume场景,而只保留了Continuation对象。

我的结论是,由于Kotlin协程设计的特点(尤其是无堆栈的事实),“协程”和“延续”的概念之间存在模糊的界线。