【问题标题】:Does Kotlin's launch start a coroutine in the main or a background thread?Kotlin 的启动是在主线程还是后台线程中启动协程?
【发布时间】:2020-10-15 20:11:56
【问题描述】:

我正在尝试在 Android 的后台运行任务,我想知道是否需要指定 GlobalScope.launch(Dispatchers.IO) { ... } 或者一个简单的 GlobalScope.launch { ... } 是否足够。我担心的是第二种形式是在主线程还是后台/IO线程中启动协程


根据Android documentation

launch 不采用Dispatchers.IO 参数。当您不传递Dispatcher 来启动时,任何从viewModelScope 启动的协程在主线程中运行

根据Kotlin documentation

在 GlobalScope 中启动协程时使用的默认调度程序由 Dispatchers.Default 表示,并且使用共享后台线程池,因此launch(Dispatchers.Default) { ... } 使用与GlobalScope.launch { ... } 相同的调度程序。

我知道协程直到最近还是实验性的,Android-Kotlin 与纯 Kotlin 开发是不同的,但这些陈述对我来说似乎是矛盾的。

【问题讨论】:

  • 实际上 viewModelScope 与 GlobalScope 不同,这意味着 viewModelScope.launch 可能与 GlobalScope.launch 可以在不同的调度程序中运行
  • GlobalScopeEmptyCoroutineContext 这意味着在其中直接启动时将使用 Dispatchers.Default。

标签: android kotlin jvm coroutine kotlin-coroutines


【解决方案1】:

GlobalScopeEmptyCoroutineContext,这意味着在其中直接启动时将使用 Dispatchers.Default。

演示行为的示例:https://pl.kotl.in/cLy3UfuZO

我担心的是第二种形式是在主线程还是后台/IO线程中启动协程?

它将启动到 Dispatchers.Default 下的 CommonPool 中,它共享与 CPU 中的内核数相同的最大线程,例如,如果您的 CPU 有 6 个内核,则最大限制为 6 个线程。然而,Dispatchers.IO 最多允许从 CommonPool 借用 64 个线程。 Dispatchers.Main 是单线程的。


viewModelScope 的故事不同,该作用域包含 Dispatchers.Main 作为其默认的启动调度程序。您可以创建一个像这样的作用域CoroutineScope(Dispatchers.Main) 以便每次不指定调度程序的启动都将在 Main 中启动,类似于viewModelScope.

【讨论】:

  • 啊,我只是误解了Android的例子。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 2021-09-10
  • 2018-06-09
  • 2020-11-28
  • 1970-01-01
相关资源
最近更新 更多