我正在阅读Kotlin协程,并知道它是基于suspend函数。但是suspend是什么意思呢?
协程或函数被挂起?
从https://kotlinlang.org/docs/reference/coroutines.html
基本上,协程是可以挂起而不阻塞线程的计算
我经常听到人们说“暂停功能”。但我认为是协程被挂起,因为它正在等待函数完成?“suspend"通常表示“停止操作”,在这种情况下,协程是空闲的。
我们是否应该说协程被挂起?
哪个协程被挂起?
从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()
...
}
它说“暂停一个协程,直到完成一些计算”,但协程就像一个轻量级线程。那么,如果协程挂起,如何进行计算呢?
我们看到await在computation上被调用,所以返回Deferred的可能是async,这意味着它可以启动另一个协程
fun computation(): Deferred<Boolean> {
return async {
true
}
}
引用说挂起协程。它是指suspend外部的async协程,还是suspend内部的computation协程?
suspend是否意味着当外部async协程正在等待(await)内部computation协程完成时,它(外部async协程)空闲(因此称为suspend)并将线程返回线程池,当子computation协程完成时,它(外部async协程)醒来,从线程池中取出另一个线程并继续?
我之所以提到线程是因为https://kotlinlang.org/docs/tutorials/coroutines-basic-jvm.html
当协程正在等待时,线程被返回到池中,当等待完成时,协程在池中的空闲线程上恢复