【问题标题】:Kotlin Coroutines. what is in charge of suspend function? how many thread could get involved when working with coroutines?Kotlin 协程。什么负责挂起功能?使用协程时可以涉及多少线程?
【发布时间】:2021-12-22 13:03:14
【问题描述】:

我有几个关于 kotlin 协程的问题。

  1. 在使用协程时可以涉及多少线程?
    如果我们只使用 Dispatchers.Main,是否只会涉及一个线程(单线程)?如果我们使用 Dispatchers.IO,是否会涉及多个线程(最多 64 个线程)?

  2. 使用 Dispatchers.Main 的用例是什么? 我读过的大多数文章都说所有 UI 相关的作品都应该出现在 Dispatchers.Main 和背景相关的作品中(比如从/to 数据库,网络请求)需要出现在 Dispatchers.IO 但我不明白 Dispatchers.Main 中存在哪些 UI 相关工作,因为 UI 相关工作并不真正需要协程(使用 Dispatchers.Main)

  3. 对于一些可能阻塞当前线程的工作,我们将 susepnd 函数与协程一起使用。例如,从磁盘读取数据、网络请求或高时态计算等。如果这些工作是由挂起函数执行的,当这些函数被挂起时由什么/谁负责?我认为必须无论如何都要处理这些挂起功能。会是下面负责的后台线程吗?

  • 从/向数据库读取/写入数据
  • 等待网络请求
  • 计算高时态计算

如果我的措辞或问题不正确,请指出。
提前谢谢你。

【问题讨论】:

    标签: android kotlin-coroutines


    【解决方案1】:
    1. 我想你自己回答了。简短的回答是:Dispatchers.Main - 单线程,Dispatchers.Default - 核心数,Dispatchers.IO - 最多 64 个。您可以阅读它 here。完整的答案有点复杂,因为可以重新配置限制,它们可能在不同的平台上有所不同(例如 JavaScript 始终是单线程的),DefaultIO 部分共享线程等。我们还可以创建自己的线程池.

    2. 我不知道你是什么意思。为了做任何事情,协程通常不是必需的。但是如果我们在 UI 应用程序中使用协程,那么我们应该使用Dispatchers.Main 来处理与 UI 相关的内容。

    3. 我们几乎不应该在协程中使用阻塞代码(一个例外是Dispatchers.IO)。如果我们这样做,协程不会暂停,而只会阻塞,可能会使我们应用程序的其他部分无响应或降低性能。

    【讨论】:

    • 对于#2,我什么时候需要使用 Dispatchers.Main?你能给我一些代码sn-p作为例子吗?因为我使用 Dispatchers.IO 在视图模型中立即从网络/数据库中检索数据,而不使用 Dispatchers.Main
    • 对于#3,是的,我正在 Dispatchers.IO 上下文中从网络/数据库中检索数据。但我很好奇的是谁/什么真正负责在挂起功能被挂起时等待该数据?后台线程此时会介入等待数据吗?
    • #2 我不确定您是否知道,但通常在 UI 应用程序中,您只能从“主”线程修改与 UI 相关的内容。尝试从后台线程添加一些视图,你会得到一个异常。出于这个原因,UI 框架通常提供用于“跳转”到主线程的工具。例如在 Android 中,我们有 runOnUiThread() 函数。它与协程一起使用的挂起等效项是Dispatchers.Main
    • #3 Dispatchers.IO 管理一个用于阻塞的线程池。当您使用Dispatchers.IO 执行阻塞操作时,您将在这些线程之一中运行您的代码。你阻止它而不是一些更关键的线程。
    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 2020-12-08
    • 2018-01-10
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多