【问题标题】:Differences between two coroutine launch in kotlinkotlin 中两个协程启动的区别
【发布时间】:2020-07-15 11:26:29
【问题描述】:

CoroutineScope(dispatchers).launch{}coroutineScope{ launch{}} 有什么区别?

假设我有以下代码:

(你可以去 Kotlin Playground 运行这个 sn-p https://pl.kotl.in/U4eDY4uJt

suspend fun perform(invokeAfterDelay: suspend () -> Unit) {
    // not printing
    CoroutineScope(Dispatchers.Default).launch {
        delay(1000)
        invokeAfterDelay()
    }


    // will print
    coroutineScope {
        launch {
            delay(1000)
            invokeAfterDelay()
        }
    }
}

fun printSomething() {
    println("Counter")
}


fun main() {
    runBlocking {
        perform {
            printSomething()
        }
    }

}

正如评论所述,当使用CoroutineScope().launch 时,它不会调用打印,但是当使用其他方式时,代码会按预期运行。

有什么区别?

谢谢。

其他问题

新发现。

如果我像这样离开perform 函数(不注释掉协程之一)

suspend fun perform(invokeAfterDelay: suspend () -> Unit) {

        CoroutineScope(Dispatchers.Default).launch {
            delay(1000)
            invokeAfterDelay()
        }

        coroutineScope {
            launch {
                delay(1000)
                invokeAfterDelay()
            }
        }

    }

那么这两个协程都会被执行??????为什么?

【问题讨论】:

标签: kotlin kotlin-coroutines coroutinescope


【解决方案1】:

CoroutineScope().launch {}coroutineScope { launch{} } 几乎没有共同之处。前者只是为 launch 设置了一个 ad-hoc 范围来运行并立即完成,后者是一个可暂停的函数,可确保在其中启动的所有协程在返回之前完成。

除了删除的 cmets 之外,您的“Further question”下的 sn-p 与原始问题相同。

第一个协程是否打印任何内容取决于非确定性行为:当performcoroutineScope 内花费时间时,等待内部launched 协程的完成,第一个可能或可能没有完成自己。它们具有相同的延迟。

【讨论】:

  • 谢谢。现在我明白了这些差异。但为什么前者不打印任何东西?如果它只为launch 设置了一个范围,那么它应该运行该函数来打印吗?
  • 因为您的整个程序还没来得及打印就结束了。
猜你喜欢
  • 2018-08-14
  • 2017-08-18
  • 1970-01-01
  • 2019-12-18
  • 2020-04-26
  • 2019-11-13
  • 2019-06-26
  • 2023-03-22
相关资源
最近更新 更多