长期使用高并发下的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 之前一样?