kotlin - 在 Kotlin 中,术语 Coroutine 和 Continuation 有什么区别?

标签 kotlin kotlin-coroutines

这两个术语似乎可以互换使用。然而,似乎也有一些差异,我正在努力解决。有区别吗?

最佳答案

确实,这两者关系密切。要恢复协程,您实际上调用 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),“协程”和“延续”的概念之间的界限很模糊。

关于kotlin - 在 Kotlin 中,术语 Coroutine 和 Continuation 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50598519/

相关文章:

android - For 循环范围必须有一个 'iterator()' 方法

android - 如何从协程后台线程更新UI线程?

android - 如何在 Kotlin 中将 Fuel 与协程一起使用?

android - 如何在Android中命名协程?

string - 如何遍历字符串列表并在 Kotlin 中连接它们?

java - 如何使用 Java 中命令的正则表达式从字符串中读取函数或有哪些替代选项?

kotlin - 类型推断仅适用于扩展功能

Kotlin 协程并发和缓存值

android - 如何重新启动已取消的作业?

Kotlin 将函数列表发送到