android - Kotlin 协程。什么负责挂起功能?使用协程时可以涉及多少线程?
问题描述
我有几个关于 kotlin 协程的问题。
使用协程时可以涉及多少线程?
如果我们只使用 Dispatchers.Main,是否只会涉及一个线程(单线程)?如果我们使用 Dispatchers.IO,是否可能涉及多个线程(最多 64 个线程)?使用 Dispatchers.Main 的用例是什么?我读过的大多数文章都说所有与UI相关的作品都应该出现在 Dispatchers 中Dispatchers.Main 中存在相关工作,因为与 UI 相关的工作实际上并不需要协程(使用 Dispatchers.Main)
对于一些可能阻塞当前线程的工作,我们将 susepnd 函数与协程一起使用。例如,从磁盘读取数据、网络请求或高时态计算等。如果这些工作是由挂起函数执行的,当这些函数被挂起时,由什么/谁负责?我认为无论如何都必须对这些挂起功能进行处理。那会是下面负责的后台线程吗?
- 从/向数据库读取/写入数据
- 等待网络请求
- 计算高时态计算
请指出我的措辞或问题是否不正确。
先感谢您。
解决方案
我想你自己回答了。简短的回答是:
Dispatchers.Main
- 单线程,Dispatchers.Default
- 核心数,Dispatchers.IO
- 最多 64 个。您可以在此处阅读。完整的答案有点复杂,因为可以重新配置限制,它们可能在不同的平台上有所不同(例如 JavaScript 始终是单线程的),Default
与 部分共享线程IO
等。我们也可以创建自己的线程池。我不确定你是什么意思。为了做任何事情,协程通常不是必需的。但是如果我们在 UI 应用程序中使用协程,那么我们应该使用
Dispatchers.Main
与 UI 相关的东西。我们几乎不应该在协程中使用阻塞代码(一个例外是
Dispatchers.IO
)。如果我们这样做,协程不会暂停,而只是阻塞,可能会使我们应用程序的其他部分无响应或降低性能。
推荐阅读
- node.js - 如何查看在 nginx web 服务器上运行的 nodejs express console.logs
- ios - 如何在 UiKit 中制作网格渐变
- visual-studio-code - 将 JSHint 设置为在 VScode 上运行 onSave
- javascript - 充满颜色的虚线箭头
- c++ - lcd.setCursor 没有将光标设置在我想要的位置
- angular - 使用服务订阅时无法更新 html 文件中的数据,但 ts 控制台显示数据
- android - 在 Android TV 中对齐更改后,Flutter 应用程序无法安装(安装卡住)?
- google-sheets - Google 表格挑战 Importrange + Substitute 或 Index Filter + Substitute
- c# - 中介配置问题。无法正确配置
- php - 条件查询并从elasticsearch中的相似文档中选择单个文档