Kotlin协程内部如何决定函数应该被挂起还是结果可以立即返回?

8zzbczxx  于 2022-12-13  发布在  Kotlin
关注(0)|答案(1)|浏览(155)

据我所知,suspend函数转换为具有附加Continuation参数的函数,并且当blocksuspendCoroutineUninterceptedOrReturn返回COROUTINE_SUSPENDED值时,suspend fun挂起。
但是Kotlin协程内部如何决定函数应该被挂起还是结果可以立即返回呢?

6mzjoqzu

6mzjoqzu1#

将其标记为suspend使函数能够挂起,但只有当函数本身调用另一个实际挂起的函数时,它才会挂起。(仅在更改当前调度程序时挂起)、Job.join()Deferred.await()SendChannel.send()ReceiveChannel.receive()Flow.collect()suspendCoroutine、和suspendCancellableCoroutine。其中一些仅在特定条件下挂起
如果您查看上述函数的源代码,就会发现它们的级别非常低,直接与Continuation发生冲突,或者具有固有行为。
我可能错过了一些基本级别的挂起函数,但它通常归结为它们中的一个是否在调用堆栈中并遇到挂起的条件。

相关问题