首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin - Coroutines在迁移到Kotlin 1.3之后,导致DefaultDispatcher占用大量的CPU

Kotlin - Coroutines在迁移到Kotlin 1.3之后,导致DefaultDispatcher占用大量的CPU
EN

Stack Overflow用户
提问于 2018-11-13 10:52:57
回答 1查看 1.2K关注 0票数 4

长期以来,我一直在高并发条件下使用Kotlin协同实验版本,性能一直很好。主要逻辑可以简化为以下代码:

代码语言:javascript
复制
// 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的正式版本,如下所示

代码语言:javascript
复制
// 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. 为什么Kotlin1.3默认使用DefaultDispatcher代替ForkJoinPool.commonPool()
  3. 如何才能像1.3之前那样保持协同的行为?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-13 11:12:22

  1. 为什么使用DefaultDispatcher要花费这么多的CPU?

它是一个完全不同的实现,它为多个性能目标优化,例如通过一个通道进行通信。它还有待于今后的改进。

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

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

  1. 如何才能像1.3之前那样保持协同的行为?

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53279409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档