【问题标题】:Are Kotlin suspend functions blocking?Kotlin 挂起功能是否阻塞?
【发布时间】:2020-10-04 08:02:06
【问题描述】:

代码:

suspend fun main() {
    println("main start")
    f1()
    println("main end")
}

suspend fun f1() {
    println("f1 start")
    delay(2_000)
    println("f1 end")
}

实际输出:

main start
f1 start
f1 end
main end

我的预期输出

main start
f1 start
main end
f1 end

这是否意味着 suspend 函数不像 JS 那样阻塞?

【问题讨论】:

  • 是什么让你觉得你会得到第二个输出? Kotlin 挂起函数是 Kotlin 协程支持的一部分 - 独特的卖点是它使异步代码看起来像同步代码一样。
  • 我不明白这是非阻塞的。这不是拦路吗?在打印main end 之前,执行在f1() 中等待2s。我对非阻塞的理解是执行不等待任何东西。一旦执行看到delay,它就会移动到下一条可用指令,即println("main end")
  • 执行等待。线程没有。这就是结构化并发的全部意义所在。最好将其建模和理解为回调。

标签: kotlin kotlin-coroutines coroutine suspend


【解决方案1】:

这是默认行为阅读更多关于挂起函数here,如果你想异步运行f1,你必须使用async

suspend fun main() {
    withContext(Dispatchers.Main) {
        println("main start")//Run in main
        val getF1 = async(Dispatchers.IO) { f1() } // Run f1 in IO
        println("main end") // Run in main
        println(getF1.await())//Run in main
    }
}

suspend fun f1() : String {
    println("f1 start")
    delay(2_000)
    println("f1 end")
    return "f1 result"
}

【讨论】:

  • 谢谢。这很清楚。我误解了,因为我假设每个挂起函数都会创建自己的协程。但实际上在我的代码中只创建了一个协程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
相关资源
最近更新 更多