- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
看来我可以使用多种机制来启动协程。其中两个是 coroutineScope
和 launch
但是阅读 Kotlin coroutine 文档我不清楚有什么区别以及我什么时候会使用一个而不是另一个
fun main() {
println("Main block ${Thread.currentThread().name}")
runBlocking {
coroutineScope {
println("Coroutine scope ${Thread.currentThread().name}")
}
launch {
println("Launch ${Thread.currentThread().name}")
}
}
}
我运行了上面的代码,可以看到两者都启动了一个新的协程。有什么区别?
最佳答案
CoroutineScope
是一种组织性的东西 - 它可以让您将协程组合在一起以执行 structured concurrency .基本上,它允许您控制范围内所有内容(包括在其他协程中启动的协程)的生命周期,并处理诸如传播结果和错误以及取消范围内的所有内容之类的事情。 More info here
所有协程构建器函数(包括launch
)在 CoroutineScope
(或上它作为接收器,如果你想那样看的话):
fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
block: suspend CoroutineScope.() -> Unit
): Job
因此,您示例中的launch
调用正在当前CoroutineScope
中运行,它由runBlocking
builder 提供。 :
expect fun <T> runBlocking(
context: CoroutineContext = EmptyCoroutineContext,
block: suspend CoroutineScope.() -> T
): T
看看你传递的 lambda 实际上是一个 CoroutineScope.() -> T
?它以 CoroutineScope
作为接收器运行 - 这就是您调用 launch
的地方。你不能从任何地方调用它!
因此,当您在您的示例中创建一个 CoroutineScope
时,您将在 这个 CoroutineScope
中嵌套一个 runBlocking
正在提供。 runBlocking
将不允许其后的其余代码继续(即它阻止执行),直到其 CoroutineScope
中的所有内容都已完成。在里面创建你自己的 CoroutineScope
可以让你定义一个你可以控制的协程子集 - 你可以 cancel
它们,但是如果 中还有其他协程在运行runBlocking
作用域,它将一直阻塞直到它们也完成。
就像 Louis 在另一个答案中所说的那样,您实际上并没有在您创建的范围内创建任何协程。代码只是在 runBlocking
开始运行您传递的代码块的协程中运行。检查一下:
fun main() {
println("Main")
runBlocking {
coroutineScope {
delay(1000)
println("I'm in a coroutine scope")
}
launch {
delay(500)
println("First new coroutine")
}
launch {
delay(50)
println("Second new coroutine")
}
}
}
Main
I'm in a coroutine scope
Second new coroutine
First new coroutine
单个协程中的代码按顺序执行 - 所以会发生什么
runBlocking
block 的协程CoroutineScope
,它只会影响您在其上启动
(等)的东西launch
并创建了一个新协程。这从延迟 500 毫秒开始,但它现在独立运行 - 不同的协程同时运行启动
第二个协程。它也自己运行,并立即延迟 50 毫秒。现在有3个协程在运行CoroutineScope
上启动,所以 runBlocking
等待它们完成。runBlocking
CoroutineScope
中的所有内容都已完成,它可以完成并允许在 main()
中继续执行如果您在您创建的范围内启动
一个协程,它将以相同的方式工作——只是您可以对其中的内容进行细粒度控制,特别是您可以专门与嵌套范围内的协程一起工作,而不会影响外部范围内的事物。重要的是一旦内部作用域完成,它就可以通知外部作用域一切都完成了,诸如此类的事情
关于kotlin - 使用 launch 启动协程或使用 coroutineScope 启动协程之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74268483/
运行真机调试时,出现如下问题。 Could not launch “MY-APP-NAME” iPhone has denied the launch request. Internal launch
每次单击“运行方式”按钮时,都会收到以下消息。 “选品无法推出,近期也没有推出。” 如果我选择“运行方式”按钮附近的下拉箭头,然后选择“新配置”选项(这是我设置为使用本地主机启动的配置)......它
启动过去有效的python文件时出现上述错误。我想我知道这是怎么发生的,但不确定如何解决。我有两台计算机双启动不同的操作系统,并使用保管箱保持它们之间的同步。过去,我以这种方式将我的Eclipse工作
我尝试使用 Eclipse 构建并运行“Hello world”,但它无法运行。我不使用 Android 或其他任何纯 C++。 http://i57.tinypic.com/x51h5h.png 最
这个问题在这里已经有了答案: "Selection cannot be launched and there are no recent launches” when Eclipse for Andr
在 Kotlin 中有多种启动协程的方法。我发现了几个示例,其中 GlobalScope 和 CoroutineScope 被使用。但是后者是在启动协程时直接创建的: 使用 GlobalScope :
我正在使用 10gen 版本在 OS X 上安装 MongoDB。 但是their installation tutorial事实证明对我来说有点稀缺。 到目前为止,我已经找到了安装为 launch
我在互联网上到处寻找,并尝试了论坛所说的一切,但没有任何效果。这个错误不断出现。我试过运行我的java项目(不适用于android),即使下拉运行按钮不起作用,因为它说“不适用”。 最佳答案 Ecli
我理解 std::async 对以下参数的作用。 std::launch::async std::launch::deferred 然而,std::launch::async | 会发生什么? std
我正在尝试使用 Eclipse 打开一个解压缩的 Android 项目,但每次我尝试运行或调试时都会显示此错误:“无法启动选择并且最近没有启动”。 所以我查找并尝试从现有源创建一个新项目,但打开时出现
我删除了 React Native 创建的默认启动屏幕文件,而是创建了一个启动图像。当我在模拟器中运行应用程序时,会显示启动图像,但是当我存档项目并通过 Testflight 打开它时,它仍然显示旧的
从深层链接(具有应用特定方案的 URL)启动我的 iOS 应用时,我在日志中收到此错误: lsd[738] : LaunchServices: application launch failed -
当我使用 visual studio code 调试 nodejs 应用程序时。visual studio code 告诉我 request 'launch': cannot launch targe
我创建了 Cocoa 应用程序,它是启动代理的类型。为了分发这个,我还创建了一个包,它安装该应用程序并将 launchagnet plist 文件复制到/Libraries/LaunchAgents
大家好,我今天在开发的 Java Swing 应用程序中发现了一个很大的疑问。 我发现的问题是launch() 当我在本地尝试我开发的应用程序时,它运行时没有任何延迟,但是当我使用 jnlp 从我的
我正在尝试使用 JavaFX 设置视频在 JFrame 中播放。 但是一旦我调用 launch() 函数来设置 JavaFX 并播放视频,我就会收到以下错误 应用程序构造函数中出现异常线程“AWT-E
我试图在 Android Studio 的外部工具中设置 javah 命令,但我得到了 IllegalArgumentException: Not a valid class name: Files\
我正在尝试创建一个简单的应用程序。我创建了一个新的 AVD。我启动了它。等了一个小时,模拟器只显示ANDROID。我卡住了。有人可以帮忙吗。 一个小时的样子请不要标记重复。我尽可能多地搜索和尝试。 我
进程文件: launch or launch.exe 进程名称: Vantarakis Launchh 进程类别:存在安全风险的进程 英文描述: launch.exe is a part o
将 google chrome 更新到最新版本 89.0.4389.82 (Official Build) (64-bit) 后开始出现错误。操作系统:Windows 10 错误: Puppeteer
我是一名优秀的程序员,十分优秀!