【问题标题】:Can something bad happen when using runBlocking from a coroutine?从协程中使用 runBlocking 时会发生不好的事情吗?
【发布时间】:2019-12-30 11:19:54
【问题描述】:

来自the documentation of runBlocking 是否清楚为什么在协程中使用它没有意义,例如嵌套它。

它甚至明确指出:

这个函数不应该在协程中使用。

但是,可以这样做:

fun main(args: Array<String>) {
    runBlocking {
        runBlocking {
            println("hi")
        }
    }
}

(IntelliJ)IDE 有点抱怨

但代码可以编译并运行。

如果在更复杂的环境中意外完成,会发生什么情况?崩溃?或者可能是死锁?

【问题讨论】:

  • runBlocking 产生新的协程范围以从“常规”代码块运行暂停代码。你想通过嵌套它们来实现什么?
  • @Pawel 我不想嵌套它们。 :) 只是,我在某个项目中目睹了它(它已经修复),我有兴趣了解可能发生的事情。

标签: kotlin coroutine kotlin-coroutines


【解决方案1】:

在更复杂的环境中意外完成会发生什么?崩溃?或者可能是死锁?

不,不是那样的。其实runBlocking是专门写来支持嵌套的:

如果指定的调度程序是另一个 runBlocking 的事件循环,则此调用使用外部事件循环。

您提到的问题实际上与嵌套runBlocking 调用无关,而是从协程调用任何阻塞代码的普遍问题。我们使用协程的特定目的是避免阻塞线程,因此在其中调用阻塞函数通常是错误的。对于Thread.sleep()java.io 调用等,您将收到相同的警告。

【讨论】:

    猜你喜欢
    • 2013-08-11
    • 2021-08-17
    • 2019-02-19
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    相关资源
    最近更新 更多