我一直在高并发性下使用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()
?
- 为什么
DefaultDispatcher
的CPU使用率如此之高?
这是一个完全不同的实现,可针对多个性能目标进行优化,例如通过通道进行通信。它取决于未来的改进。
- 为什么kotlin 1.3默认使用
DefaultDispatcher
代替ForkJoinPool.commonPool()
?
实际上它一直在使用Default
调度员,但Default
的分辨率发生了变化。在实验阶段,它等于CommonPool
但现在它更喜欢自定义实现。
- 如何像1.3之前一样保持协同程序的行为?
将kotlinx.coroutines.scheduler
系统属性设置为off
。