Scala Futures 和多线程

Scala Futures and Multithreading

我是 Scala 的新手,我正在尝试掌握 futures 和多线程

我有一个程序的单线程版本,可以对矩阵进行一些计算

SingleThreadCalc {
  def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = Future{doMath(matrix)}
}

我现在想要的是做一个多线程的版本。 只传递一个带有多个线程的 ExecutionContext 就足够了吗?

MultiThreadCalc {
  def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = 
Future{doMath(matrix)} (ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)))

这会在所有线程之间分担计算负载还是根本不会发生?

简答:否

长答案:

object MultiThreadCalc {
 def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = 
    Future{doMath(matrix)}(ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)))
}

上面的代码,对于run的每一次调用,都会分配一个新的线程池,这个线程池永远不会被关闭,它会被用来执行一个单一的方法doMath(所以将仅使用该池中的 1 个线程。

现在,如果您想并行执行 doMath 本身,那么您需要将 ts 定义修改为可并行化,可能通过使其采用 implicit ec: ExecutionContext 参数并在其中使用该参数它的定义。

但是,如果您希望能够并行 运行 多次调用 doMath,那么您可以执行以下操作:

object MultiThreadCalc {
  def run(matrix : Seq[Seq[Double]])(implicit ec: ExecutionContext) : Future[Seq[Seq[Double]] = Future{doMath(matrix)}
}

然后在 "outside" 上可能 ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)) 创建一个 ExecutionContext 并在您想要在其上执行逻辑时使用它。