Multithreading Scala期货和多线程

Multithreading Scala期货和多线程,multithreading,scala,future,Multithreading,Scala,Future,我是Scala新手,我正试图掌握未来和多线程技术 我有一个单线程版本的程序,可以对矩阵进行一些计算 SingleThreadCalc { def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = Future{doMath(matrix)} } 我现在想做的是它的多线程版本。 只传递带有多个线程的ExecutionContext是否足够 MultiThreadCalc { def run(matrix : Seq[Se

我是Scala新手,我正试图掌握未来和多线程技术

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

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定义修改为可并行化的,可能是通过使其接受隐式ec:ExecutionContext参数并在其定义中使用该参数

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

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

然后在外部创建一个ExecutionContext(可能是ExecutionContext.FromExecutors.newFixedThreadPool10),并在需要执行逻辑时使用它。

我给出的简短回答显然是这样的,但我认为最好的答案应该是运行这个东西并进行测量。我认为如果你要将你的doMath分解为可以并行执行的任务,那么你的第一步是。@jamborta现在迭代矩阵的元素是一个双重过程,我正在考虑将其重构为行处理,但我能控制哪个线程结束吗处理每一行?我怀疑。。。我将重构我的域,然后尝试更改ExecutionContext,以便并行执行