Kotlin 我可以使用Dispatchers.Default进行CPU限制/密集型操作吗?

Kotlin 我可以使用Dispatchers.Default进行CPU限制/密集型操作吗?,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我想了解在生产级服务器端应用程序中执行阻塞CPU操作的最佳实践/方法。(请注意,我指的是服务器端,而不是Android应用程序) 我所说的阻塞CPU操作是什么意思? 运行在CPU上并消耗CPU的操作,例如,在while循环中进行的巨大矩阵乘法、巨大数据转换等 我的设置 我们正在构建由协同程序提供动力的kotlin dsl 我们使用单线程创建了自己的CoroutineScope,用于非阻塞操作,因此来自回调的变异变量是线程安全的,因为它们都在同一线程上运行 我们建议用户使用with contex

我想了解在生产级服务器端应用程序中执行阻塞CPU操作的最佳实践/方法。(请注意,我指的是服务器端,而不是Android应用程序)

我所说的阻塞CPU操作是什么意思?

运行在CPU上并消耗CPU的操作,例如,在while循环中进行的巨大矩阵乘法、巨大数据转换等

我的设置

  • 我们正在构建由协同程序提供动力的kotlin dsl
  • 我们使用单线程创建了自己的
    CoroutineScope
    ,用于非阻塞操作,因此来自回调的变异变量是线程安全的,因为它们都在同一线程上运行
  • 我们建议用户使用
    with context(Dispatchers.IO)
    来执行所有阻塞IO操作
开放性问题

  • 我们有固定的策略来执行非阻塞操作和线程安全突变,以及上面提到的执行
    IO
    ops

  • 我们正在探索执行阻塞CPU绑定操作的选项,如开头所述

一些解决方案

  • 使用
    调度程序。默认值
    用于do阻塞cpu操作

    • 是否有人预见到使用默认dispatcher会出现任何问题
    • 如果代码/可传递lib的其他部分也在使用
      Default
      dispatcher怎么办
  • 使用固定线程(通常等于没有CPU线程)创建单独的
    CoroutineScope
    ,然后要求用户使用该隔离作用域来运行任何阻塞的CPU绑定操作

我们应该采用哪种方法?利与弊?还有其他好的替代方法吗

旁注


来自Scala,通常不喜欢使用全局执行上下文和
分派器。默认值
以某种方式映射到全局上下文

除非您想限制特定类型任务使用的CPU内核,否则我认为使用
分派器。默认值
是一个良好的开端。在,建议使用
withContext(Dispatchers.Default)
包装CPU绑定函数。除非您想限制特定类型任务使用的CPU内核,否则我认为使用
Dispatchers.Default
是一个良好的开端。在中,建议使用
withContext(Dispatchers.Default)
包装CPU绑定函数。