gpt4 book ai didi

kotlin - 协程范围构建器流程如何工作

转载 作者:行者123 更新时间:2023-12-02 13:11:35 26 4
gpt4 key购买 nike

Kotlin says

  • runBlocking 方法阻塞当前线程等待
  • coroutineScope 只是挂起,释放底层线程以供其他用途。
  • 因此 runBlocking 是一个常规函数,而 coroutineScope 是一个挂起函数
fun main() = runBlocking { // this: CoroutineScope
launch {
delay(200L)
println("Task from runBlocking")
}

coroutineScope { // Creates a coroutine scope
launch {
delay(500L)
println("Task from nested launch")
}

delay(100L)
println("Task from coroutine scope") // This line will be printed before the nested launch
}

println("Coroutine scope is over") // This line is not printed until the nested launch completes
}

在上面的例子中,我期望的是:-

  • runBlocking 阻塞主线程,launch 会被执行到 delay(200L)
  • 于是,底层协程发布,运行coroutineScope,来到delay(500L) & delay(100L)
  • 所以,底层协程再次被释放,它应该打印 println("Coroutine scope is over").

这就是我对runBlockingcoroutineScope的理解。没有按预期工作。

输出是

Task from coroutine scope
Task from runBlocking
Task from nested launch
Coroutine scope is over

谁能用简单的方式解释一下。

最佳答案

launch 导致 block 异步执行,因此对 launch 的调用立即返回,并且协程继续运行并且不t 等待启动 block 的执行。

因此,在runBlocking被调用后,第一和第二个launch被相继调用,紧接着协程被暂停在delay (100L)

100 毫秒后,协程恢复并打印“Task from coroutine scope”,然后嵌套协程范围的 block 的执行结束。协程作用域总是等待它启动的所有作业执行结束,所以它在这里等待 500 毫秒。

同时,两个已启动的 block 被执行,因此首先打印“Task from runBlocking”(从开始 200 毫秒后),然后打印“Task from nested launch”(从开始 500 毫秒后)。

最终,在内部启 Action 业完成后,内部协程范围结束等待,外部协程继续并打印“Coroutine scope is over”。

这就是故事。我希望对理解代码的执行方式以及为什么打印顺序是这样有所帮助。

关于kotlin - 协程范围构建器流程如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61545302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com