首页 > 解决方案 > Kotlin 协程。什么负责挂起功能?使用协程时可以涉及多少线程?

问题描述

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

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

  2. 使用 Dispatchers.Main 的用例是什么?我读过的大多数文章都说所有与UI相关的作品都应该出现在 Dispatchers 中Dispatchers.Main 中存在相关工作,因为与 UI 相关的工作实际上并不需要协程(使用 Dispatchers.Main)

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

请指出我的措辞或问题是否不正确。
先感谢您。

标签: androidkotlin-coroutines

解决方案


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

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

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


推荐阅读