代码之家  ›  专栏  ›  技术社区  ›  mco

Kotlin Coroutine GlobalScope文档清晰度

  •  0
  • mco  · 技术社区  · 4 年前

    我很难理解GlobalScope的用法和文档。 文件规定:

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

    全局作用域用于启动顶级协程,这些协程是 在整个应用程序生命周期内运行,不会被取消 过早。全局作用域的另一个用途是运行运算符 调度员。未被罚款,他们没有任何工作。

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

    1. 当GlobalScope不受任何工作约束时,这意味着什么?因为我能做到

      val job = GlobalScope.launch {
          // some work
      }
      job.cancel() 
      
    2. 它说它们不会过早取消。这是什么意思?如您所见,我可以取消它。

    3. 最后,它说,它在整个应用程序生命周期内运行。因此,作用域会一直存在,直到应用程序死亡。这与 CoroutineScope ? 当我退出Android时 Activity 正在跑步 协程范围 ,它仍然会活着,一直运行到完工。这仅仅意味着 协程范围 完成后将通过垃圾收集进行清理 GlobalScope 习惯于?

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

    0 回复  |  直到 4 年前
        1
  •  3
  •   Mark    4 年前
    1. 当GlobalScope不受任何工作约束时,这意味着什么?因为我能。。。

    这是指缺乏 Job 与关联的对象 CoroutineScope ,不是单独的协程 工作 在“范围”之内。

    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. 最后,它说,它在整个应用程序生命周期内运行。因此,作用域会一直存在,直到应用程序死亡。这与CoroutinScope相比如何?当我在运行CoroutineScope的过程中退出Android活动时,它将仍然有效并运行到完成。这是否意味着CoroutinScope在完成后将通过垃圾收集进行清理,而GlobalScope则不会?

    GlobalScope 是一个对象类-一个单例,因此只要它在其中运行,它就会持续很长时间。 全球范围 执行器 协程范围 它只是库附带的预定义范围。子程序可以从以下位置启动 全球范围 但呼叫者必须注意保留 工作 对象并通过取消每个协程 工作 .使用自定义时 协程范围 您可以更好地控制调用扩展函数时会发生什么 CoroutineScope.cancel() -例如取消在该范围内“运行”的所有子协程。

    我不是这方面的权威,但这就是我解读文档和观察图书馆行为的方式。

    老实说,我认为大多数人都很难简单简洁地解释协程——关于这个主题的大多数文章都不容易阅读,通常我会更加困惑。在深入研究了库源代码之后,它通常会在一定程度上消除一些东西,但你也可以看到它仍然处于持续开发的状态。