我可以使用Dispatchers.Default进行CPU绑定/密集型操作吗?

问题描述

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

阻止CPU操作是什么意思?

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

我的设置

  • 我们正在建造由协程驱动的kotlin dsl
  • 我们使用单线程创建了自己的CoroutineScope用于非阻塞操作,因此回调中的变异变量是线程安全的,因为它们都在同一线程上运行
  • 我们建议用户使用withContext(Dispatchers.IO)来执行所有阻塞的IO操作

悬而未决的问题

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

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

某些解决方案

  • 使用Dispatchers.Default来阻止CPU操作

    • 是否有人预见到使用默认调度程序会有任何问题?
    • 如果代码/传递库的其他部分也使用Default调度程序怎么办?
  • 使用固定线程(通常等于CPU线程数)创建单独的CoroutineScope,然后要求我们的用户使用该隔离的范围来运行任何受CPU限制的阻塞操作

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

旁注

来自Scala,通常不建议使用Global执行上下文,并且Dispatchers.Default以某种方式映射到全局上下文

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...