【问题标题】:Is there a difference between using GlobalScope.launch and CoroutineScope().launch to launch a coroutine?使用 GlobalScope.launch 和 CoroutineScope().launch 启动协程有区别吗?
【发布时间】:2022-01-05 12:43:31
【问题描述】:

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

  1. 使用GlobalScope

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

    fun loadConfiguration() {
        CoroutineScope(Dispatchers.Main).launch {
            val config = fetchConfigFromServer() // network request
            updateConfiguration(config)
        }
    }
    

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

第二种情况不违反principle of structured concurrency吗?

【问题讨论】:

  • @ADM,谢谢你的链接,好像就是这样。
  • 是的,第二个是反模式。如果您不打算存储对它的引用或管理其生命周期,则没有理由创建新范围。并且在某些情况下使用 GlobalScope 是一种代码异味,至少经常会在您使用它时默认显示编译器警告。我认为他们创造了一个过度使用它的新手怪物,因为他们在所有基本示例中都使用了它。

标签: android kotlin kotlin-coroutines coroutinescope structured-concurrency


【解决方案1】:

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

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

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

我认为CoroutineScope().launch 成语的出现完全是因为它绕过了您对GlobalScope.launch 的警告。

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 2019-11-13
    • 2021-08-26
    • 2020-04-09
    • 2022-11-12
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2019-07-17
    相关资源
    最近更新 更多