长期在高并发下使用 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之后,迁移到正式版的coroutines之后,是这样的
// 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
.我的问题是:
DefaultDispatcher
花费这么多 CPU 使用率? DefaultDispatcher
代替 ForkJoinPool.commonPool()
默认情况下? 最佳答案
- Why does it cost so much CPU usage with
DefaultDispatcher
?
这是一个完全不同的实现,它针对多个性能目标进行了优化,例如通过 channel 进行通信。它受制于 future 的改进。
- Why does kotlin 1.3 use
DefaultDispatcher
in place ofForkJoinPool.commonPool()
by default?
其实它一直在使用
Default
调度员一直在,但Default
的分辨率改变了。在实验阶段,它等于CommonPool
但现在它更喜欢自定义实现。
- How to keep the behavior of coroutines just like before 1.3?
设置
kotlinx.coroutines.scheduler
系统属性到 off
.
关于Kotlin - 迁移到 Kotlin 1.3 后,协程会导致 DefaultDispatcher 使用大量 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53279409/