当前位置: 首页 > 知识库问答 >
问题:

挂起函数在Kotlin协式中是什么意思?

盛琪
2023-03-14

我正在阅读Kotlin Coroutine并且知道它是基于suspend函数的。但是suspend是什么意思呢?

Coroutine或函数挂起?

摘自https://kotlinlang.org/docs/reference/coroutines.html

哪一个被停职了?

摘自https://kotlinlang.org/docs/reference/coroutines.html

为了继续类比,await()可以是一个挂起函数(因此也可以从async{}块中调用),它挂起一个协程,直到完成某些计算并返回其结果:

async { // Here I call it the outer async coroutine
    ...
    // Here I call computation the inner coroutine
    val result = computation.await()
    ...
}
fun computation(): Deferred<Boolean> {
    return async {
        true
    }
}

当coroutine等待时,线程返回到池中,并且当等待完成时,coroutine在池中的空闲线程上恢复

共有1个答案

林俊英
2023-03-14

挂起功能是一切关系的中心。挂起函数只是一个可以暂停并在以后恢复的函数。它们可以执行一个长时间运行的操作,并等待它完成而不阻塞。

除了添加suspend关键字外,挂起函数的语法与常规函数类似。它可以接受一个参数并具有一个返回类型。但是,挂起函数只能由另一个挂起函数调用或在一个协同序列中调用。

suspend fun backgroundTask(param: Int): Int {
     // long running operation
}

在此情况下,编译器将挂起函数转换为另一个没有挂起关键字的函数,该函数采用continuation 类型的附加参数。例如,上面的函数将被编译器转换为:

fun backgroundTask(param: Int, callback: Continuation<Int>): Int {
   // long running operation
}
interface Continuation<in T> {
   val context: CoroutineContext
   fun resume(value: T)
   fun resumeWithException(exception: Throwable)
}
 类似资料:
  • 我正在尝试理解kotlin协程,我来自C#,在kotlin中有一些我不理解的地方。在这种情况下,我正在使用Qukus框架中的静态编程语言编写一个webapi。从我可以看出,如果我将控制器(或资源)函数标记为挂起函数,Qukus将自动在协程中启动它。 我的问题是,我不知道挂起该协程的首选方法是什么。我在kotlin协程上看到的绝大多数示例都使用delay()函数,该函数在内部使用suspendCan

  • 我正在尝试从 Java 7 调用科特林函数。我正在使用协程,这个被调用的函数正在挂起,例如: 我在版本 0.25.3 中使用了协程,我可以通过传递继续来模拟简单的 Java 回调样式 ,但是我使用的是Android,这意味着只使用Java 7。另一方面,简单的< code>Future太愚蠢了,因为我不想定期检查函数是否完成——我只想在函数完成时被调用。我真的希望避免添加新的库或许多额外的类/方法

  • 这是一个标准的Kotlin函数(据我所知) 但我不认为它在任何地方解释什么。()意思是...

  • 在这里做什么,它是否将这个函数附加到其他函数?

  • 我正在用Node和Cheerio构建一个网络刮刀,对于某个网站,我得到了以下错误(它只发生在这一个网站上,没有其他我试图刮掉的网站)。 它每次都发生在不同的位置,因此有时抛出错误的是,而其他时间则没有问题,它是一个完全不同的url: 这是非常棘手的调试,我真的不知道从哪里开始。首先,什么是套接字挂起错误?这是404错误还是类似的错误?或者这仅仅意味着服务器拒绝了连接? 我在任何地方都找不到解释!

  • 问题内容: 我最近在查看Python 3.3语法规范时发现了一些有趣的东西: 在Python 2中缺少可选的“箭头”块,并且在Python 3中找不到有关其含义的任何信息。事实证明这是正确的Python,并已被解释器接受: 我认为这可能是某种前提语法,但是: 我无法x在此处进行测试,因为它仍未定义, 无论我在箭头(例如2 < 1)后面加上什么,它都不会影响功能行为。 熟悉此语法的任何人都可以解释吗