使用 GlobalScope.launch 和 CoroutineScope().launch 启动协程有区别吗?

Ser*_*gey 6 android kotlin kotlin-coroutines coroutinescope structured-concurrency

在 Kotlin 中启动协程有多种方法。我发现了几个使用GlobalScope和的例子CoroutineScope。但后一个是在启动协程时直接创建的:

  1. 使用GlobalScope

    fun loadConfiguration() {
        GlobalScope.launch(Dispatchers.Main) {
           val config = fetchConfigFromServer() // network request
           updateConfiguration(config)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用CoroutineScope实例,在启动协程时直接创建:

    fun loadConfiguration() {
        CoroutineScope(Dispatchers.Main).launch {
            val config = fetchConfigFromServer() // network request
            updateConfiguration(config)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

在这种情况下,这两种方法有区别吗?

第二种情况不是违反了结构化并发的原则吗?

Mar*_*nik 4

第二种情况不是违反了结构化并发的原则吗?

实际上,这两种情况都同样违反了它,因为它们具有几乎完全相同的语义。您可能遇到过的所有反对使用的警告都同样GlobalScope.launch适用。CoroutineScope().launch一个细微的区别是后者完全没有意义,而前者至少有一些合法的用例。

写作CoroutineScope().launch反而会GlobalScope.launch掩盖意图和后果,并且每次都会创建一个不必要的对象。

我认为这个CoroutineScope().launch习语的出现仅仅是因为它规避了您收到的警告GlobalScope.launch