多核性能如何与 Scala 中的执行上下文和线程池相关

How does multi core performance relate to execution contexts and thread pools in Scala

所以我有一个现有的 Spring 库,它执行我打算使用 Scala Futures 包装的一些阻塞任务(公开为服务)以展示多处理器功能。目的是让人们对 Scala/Akka 技术堆栈感兴趣。

这是我的问题。 假设我从现有的 Spring 库中获得了两项服务。这些服务执行不同的阻塞任务(IO、数据库操作)。 我如何确保这些任务(服务调用)是跨多个核心执行的? 例如,我如何使用自定义执行上下文? 每次服务呼叫都需要一个吗? 执行上下文/线程池如何与多核操作相关?

感谢任何对此理解的帮助。

您无法确保任务将在不同的内核上执行。示例程序的工作流程就是这样。

  1. 编写一个程序,在两个不同的线程(Futures、Java 线程、Actor,随便你怎么说)上做两件事。
  2. JVM 发现您需要两个线程,因此它启动两个 JVM 线程并将它们提交给 OS 进程调度程序(或其他 反过来,没关系)。
  3. OS决定每个线程在哪个核上执行。通常,它会尝试将线程放在不同的核心上以最大化整体效率但并不能保证;您可能会遇到这样一种情况,即您的 10 个 JVM 线程将在一个内核上执行,尽管这是极端情况。

编写并发和看似并行的应用程序的经验法则是:"Here, take my e.g. 10 threads and TRY to split them among the cores."

有一些技巧,例如调整 CPU 亲和力(低级别,风险很大)或产生过多的线程以确保它们是并行的(大量的开销和 GC 的工作) .但是,一般来说,OS 通常不会那么重载,如果你创建两个,例如演员,一个用于数据库,一个用于网络 IO 他们应该并行工作。

更新: 全局 ExecutionContext 管理线程池。但是,您可以定义自己的并向其提交可运行文件 myThreadPool.submit(runnable: Runnable)。查看评论中提供的链接。