【问题标题】:How does method in coroutine block work in Kotlin?协程块中的方法如何在 Kotlin 中工作?
【发布时间】:2021-08-01 14:39:39
【问题描述】:

协程有两种类型。堆叠和无堆叠。而 Kotlin 协程是无栈协程。

另一方面,一旦一个方法被调用,它就会堆积在内存中。并且我们可以使用方法进行递归调用。

在 Kotlin 中,我需要做的就是为协程上下文中调用的方法添加 suspend 关键字。

它没有堆栈,那么它是如何工作的呢?

我的猜测是,由于协程对象属于某个线程,因此线程拥有它们。可以说,是的。那么它是如何在引擎盖下工作的呢?

【问题讨论】:

    标签: kotlin coroutine kotlin-coroutines


    【解决方案1】:

    Kotlin 协程实际上是堆栈式和无堆栈式的混合体。对于每个函数调用,都有一个常规的 Java 堆栈帧。当您从 suspend fun 调用 suspend fun 时,JVM 堆栈会以通常的方式增长,如果调用返回而没有发生任何挂起,堆栈也会以常见的 JVM 方式展开。

    当函数挂起时,情况会有所不同。此时,Java 方法返回并且 JVM 堆栈展开。然而,在构建调用链的同时,另一个堆上结构正在形成:Continuation 对象的链表。每个suspend fun 调用都会创建另一个这样的对象,您可以将其视为堆栈帧(它包含所有局部变量的值),但在字节码级别实现,作为常规 Java 对象。

    Continuation 链是 Kotlin 协程的“无堆栈”方面。当您恢复延续时,您将进入最内层的函数调用(包含函数暂停的位置)。当该函数想要返回时,它不会以正常方式返回,而是会恢复其调用者的继续。这将在调用者中重复,因此当您在 up suspend fun 调用堆栈中移动时,您还将在 JVM 调用堆栈中向下移动:JVM 堆栈增长随着可挂起函数的返回。

    【讨论】:

    • 嗨,Marko,感谢您的描述性回答。我想深入挖掘。您能否提供可以提供帮助的资源的链接?
    • 您可以查看我在 KotlinConf 2017 上的演讲,其中我展示了一些内部实现细节以及该机制的实际示例youtube.com/watch?v=YrrUCSi72E8
    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 2019-04-30
    • 1970-01-01
    • 2020-09-15
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多