【问题标题】:Kotlin Coroutine GlobalScope documentation clarityKotlin Coroutine GlobalScope 文档清晰
【发布时间】:2021-03-28 13:47:59
【问题描述】:

我很难理解 GlobalScope 的用法和文档。 文档指出:

一个未绑定到任何作业的全局 CoroutineScope。

全局作用域用于启动顶级协程,它们是 在整个应用程序生命周期内运行并且不会被取消 过早地。全局作用域的另一个用途是运行在 Dispatchers.Unconfined,没有任何与之相关的工作。

应用程序代码通常应该使用应用程序定义的 协程范围。在 GlobalScope 的实例上使用异步或启动 非常不鼓励。

  1. 当 GlobalScope 未绑定到任何作业时是什么意思?因为我能做到

    val job = GlobalScope.launch {
        // some work
    }
    job.cancel() 
    
  2. 它说它们不会过早取消。这是什么意思?正如你在上面看到的,我可以取消它。

  3. 最后它说,它在整个应用程序生命周期内运行。因此范围一直存在,直到应用程序死亡。这与CoroutineScope 相比如何?当我在运行CoroutineScope 的过程中退出Android Activity 时,它仍然会存活并运行直到完成。这是否只是意味着CoroutineScope 将在完成后通过垃圾收集进行清理而GlobalScope 不会?

文档链接: https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/-global-scope/

【问题讨论】:

    标签: android kotlin kotlin-coroutines global-scope


    【解决方案1】:
    1. GlobalScope 未绑定到任何作业是什么意思?因为我能做到……

    这是指缺少与CoroutineScope 关联的Job 对象,而不是“范围”内的单个协程Jobs。

    1. 它表示它们不会提前取消。这是什么意思?正如你在上面看到的,我可以取消它。

    在任何时候调用GlobalScope.cancel() 都会抛出IllegalArgumentException

    所以这会产生同样的错误:

    fun main(args: Array<String>) {
    
        val myScope : CoroutineScope = object : CoroutineScope {
            override val coroutineContext: CoroutineContext = Dispatchers.IO // no job added i.e + SupervisorJob()
        }
    
    
        val job = myScope.launch { longRunningTask() }
    
        Thread.sleep(5_000)
        job.cancel() // this is fine - individual coroutine cancelled
        myScope.cancel() // this will throw an error, same as GlobalScope.cancel()
        
    }
    
    1. 最后它说,它在整个应用程序生命周期内运行。因此范围一直存在,直到应用程序死亡。这与 CoroutineScope 相比如何?当我在正在运行的 CoroutineScope 中间退出一个 Android Activity 时,它仍然是活动的并一直运行直到完成。这是否意味着 CoroutineScope 将在完成后通过垃圾收集进行清理而 GlobalScope 不会?

    GlobalScope 是一个对象类 - 一个单例,因此只要它运行的进程持续。GlobalScope 实现 CoroutineScope 它只是库附带的预定义范围。协程可以从GlobalScope 启动,但调用者必须注意保留Job 对象并通过Job 取消每个协程。使用自定义 CoroutineScope 时,您可以更好地控制调用扩展函数 CoroutineScope.cancel() 时发生的情况 - 例如取消所有在该范围内“运行”的子协程。

    我在这个主题上没有权威,但这就是我解释文档和观察图书馆行为的方式。

    老实说,我认为大多数人都难以简明扼要地解释协程 - 大多数关于该主题的文章都不容易阅读,而且通常我会更加困惑。在深入研究库源代码后,它通常会消除一些东西,但您也可以看到它仍然处于持续开发的状态。

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 2020-05-06
      • 1970-01-01
      相关资源
      最近更新 更多