Kotlin - Coroutines在迁移到Kotlin 1.3后导致使用DefaultDispatcher的CPU使用率很高

问题描述 投票:2回答:1

我一直在高并发性下使用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

我的问题是:

  1. 为什么DefaultDispatcher的CPU使用率如此之高?
  2. 为什么kotlin 1.3默认使用DefaultDispatcher代替ForkJoinPool.commonPool()
  3. 如何像1.3之前一样保持协同程序的行为?
kotlin coroutine java.util.concurrent kotlin-coroutines
1个回答
1
投票
  1. 为什么DefaultDispatcher的CPU使用率如此之高?

这是一个完全不同的实现,可针对多个性能目标进行优化,例如通过通道进行通信。它取决于未来的改进。

  1. 为什么kotlin 1.3默认使用DefaultDispatcher代替ForkJoinPool.commonPool()

实际上它一直在使用Default调度员,但Default的分辨率发生了变化。在实验阶段,它等于CommonPool但现在它更喜欢自定义实现。

  1. 如何像1.3之前一样保持协同程序的行为?

kotlinx.coroutines.scheduler系统属性设置为off

© www.soinside.com 2019 - 2024. All rights reserved.