首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Coroutines: main() runBlocking与悬挂main

Coroutines: main() runBlocking与悬挂main
EN

Stack Overflow用户
提问于 2022-04-30 08:40:49
回答 1查看 889关注 0票数 6

获取以下两个代码示例(分别取自Kotlin文档和Coroutines库自述):

代码语言:javascript
运行
复制
import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        delay(2000)
        println("World")
    }
    println("Hello")
}

在Kotlin >= 1.3.0中,可以将main()函数标记为suspend可实现,并直接使用coroutineScope

代码语言:javascript
运行
复制
import kotlinx.coroutines.*

suspend fun main() = coroutineScope {
    launch {
        delay(2000)
        println("World")
    }
    println("Hello")
}

两者产生的产出相同:

代码语言:javascript
运行
复制
Hello
World

这两种方法在功能上有什么不同吗?如果是,他们是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-30 09:37:50

runBlocking()coroutineScope()在功能上非常相似。它们都暂停当前的执行,直到内部协同线完成。区别在于,runBlocking()是从一个常规的不可挂起的代码中执行的,所以它通过阻塞等待,而coroutineScope()是从可挂起的上下文中使用的,所以它挂起。

这种差异使他们在内部做了很多不同的事情。runBlocking()必须首先初始化整个协同机制,然后才能执行可挂起的lambda。coroutineScope()可以访问现有的协同上下文,因此它只调度要执行和挂起的内部lambda。

现在,suspend fun main()只是Kotlin编译器提供的一种“快捷方式”,可以使coroutines应用程序更容易初始化。在内部,它在真正的主功能和可挂起的主要功能之间创建了一座桥梁。它生成一个独立的main()函数,它是不可挂起的,是“真实”的主函数。这个函数初始化一个协同线并使用内部runSuspend()实用程序来执行您的suspend fun main()。这里描述了这一点:https://github.com/Kotlin/KEEP/blob/master/proposals/enhancing-main-convention.md#implementation-details-on-jvm-1

这两种方法开始一个协同应用程序是非常相似的,你可以选择根据你的口味。一个值得注意的区别是,runBlocking()使用当前的“主”线程创建了一个调度程序。suspend fun main()也使用主线程执行,但它没有指定dispatcher,所以每当您使用coroutineScope()时,它都会切换到Dispatchers.Default。因此,您的runBlocking()示例使用单线程调度程序,而coroutineScope()示例使用多线程Dispatchers.Default。然而,在选择这两种方法时,不应真正考虑到这种差异。我们随时都可以很容易地更换调度员。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72066943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档