我正在阅读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
当协程正在等待时,线程被返回到池中,当等待完成时,协程在池中的空闲线程上恢复