【问题标题】:Kotlin coroutines GlobalScope.launch vs runBlockingKotlin 协程 GlobalScope.launch 与 runBlocking
【发布时间】:2019-07-17 10:31:10
【问题描述】:

这两种方法有什么区别吗?

runBlocking {
   launch(coroutineDispatcher) {
      // job
   }
}
GlobalScope.launch(coroutineDispatcher) {
   // job
}

【问题讨论】:

    标签: kotlin kotlin-coroutines coroutinescope


    【解决方案1】:

    runBlocking 运行新的协程并中断当前线程直到其完成。不应从协程中使用此功能。它旨在将常规阻塞代码与以挂起样式编写的库连接起来,用于主要功能和测试。

    // line 1
    runBlocking {
       // line 2
       launch(coroutineDispatcher) {
          // line 3
       }
       // line 4
    }
    // line 5
    someFunction()
    

    如果使用runBlocking,代码行将按下一个顺序执行:

    line 1
    line 2
    line 4
    line 3
    line 5 // this line will be executed after coroutine is finished
    

    全局作用域用于启动在整个应用程序生命周期内运行且不会提前取消的顶级协程。全局范围的另一个用途是在 Dispatchers.Unconfined 中运行的运算符,它们没有任何与之关联的作业。 应用程序代码通常应该使用应用程序定义的 CoroutineScope,强烈建议不要在 GlobalScope 的实例上使用异步或启动。

    // line 1
    GlobalScope.launch(coroutineDispatcher) {
       // line 2
    }
    // line 3
    someFunction()
    

    如果使用GlobalScope.launch,代码行将按下一个顺序执行:

    line 1
    line 3
    line 2
    

    因此runBlocking 阻塞当前线程直到其完成,GlobalScope.launch 不会。

    【讨论】:

    • 谢谢,但我还是一头雾水。在它所写的任何地方,都不鼓励使用 GlobalScope - 但我认为我的情况没有任何区别(Spring 的 PostConstruct,它启动 SEDA 机制)。如果我指定自定义协程调度程序,在我的情况下,两种方法有什么区别?
    • 有一个很好的讨论为什么不鼓励使用 GlobalScope stackoverflow.com/questions/54335365/…
    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    相关资源
    最近更新 更多