kotlin - Kotlin - 在迁移到 Kotlin 1.3 后,协程会导致 DefaultDispatcher 占用大量 CPU
问题描述
长期使用高并发下的Kotlin协程实验版,性能一直很优秀。主要逻辑可以简化为以下代码:
// works fine in kotlin 1.2 with 3000+ QPS for a 40-core host
launch {
// running in ForkJoinPool.commonPool() by default
// non-blocking IO function
val result = supendFunction()
doSomething(result)
}
但是,在我将 kotlin 更新到 1.3,并迁移到协程的正式版本之后,像这样
// kotlin 1.3 version
GlobalScope.launch {
// running in DefaultDispatcher
// non-blocking IO function
val result = supendFunction()
doSomething(result)
}
CPU 使用率从 2% 上升到 50%,没有抛出任何异常或错误。我注意到的唯一区别是协程不再ForkJoinPool.commonPool()
像以前那样执行。相反,它们在DefaultDispatcher
线程中运行,例如DefaultDispatcher-worker-30
.
我的问题是:
- 为什么它会花费如此多的 CPU 使用率
DefaultDispatcher
? - 为什么默认使用 kotlin 1.3
DefaultDispatcher
代替ForkJoinPool.commonPool()
? - 如何保持协程的行为就像 1.3 之前一样?
解决方案
- 为什么它会花费如此多的 CPU 使用率
DefaultDispatcher
?
这是一个完全不同的实现,可以针对多个性能目标进行优化,例如通过通道进行通信。它有待于未来的改进。
- 为什么默认使用 kotlin 1.3
DefaultDispatcher
代替ForkJoinPool.commonPool()
?
其实一直都在用Default
dispatcher,只是分辨率Default
变了。在实验阶段,它等于,CommonPool
但现在它更喜欢自定义实现。
- 如何保持协程的行为就像 1.3 之前一样?
将kotlinx.coroutines.scheduler
系统属性设置为off
。
推荐阅读
- azure - 将多个 Windows 计划任务从 VM 移植到单个 Web 作业
- javascript - 在 json 数据中写入时,onclick 属性未绑定在 html 代码中
- excel - 获取由宏打开/创建的 Excel 工作簿的灰屏
- python - if 语句发出 ply py
- html - 外部 CSS 不起作用,但内部 CSS
- python - 通过 Python 中的类方法访问局部变量
- reactjs - React Native Navigation,如何在 Class Components 之间传递和使用 Props?
- google-cloud-bigtable - 从google bigtable中删除空行的有效方法
- ios - 谷歌地图在多个纬度经度之间绘制折线
- javascript - 输入字段表单验证 - 复选框