【问题标题】:Scala Futures and MultithreadingScala 期货和多线程
【发布时间】:2017-11-18 04:52:11
【问题描述】:

我是 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)))

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

【问题讨论】:

  • 我给出的简短答案是“显然是这样”,但我认为最好的答案来自运行和测量。
  • 我认为第一步是将你的 doMath 分解为可以并行执行的任务。
  • @jamborta 现在它是一个双倍的迭代矩阵的元素我正在考虑重构为行处理但我可以控制哪个线程最终处理每一行吗?

标签: multithreading scala future


【解决方案1】:

简短回答:不。

长答案:

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

上面的代码将在每次调用run 时分配一个永远不会关闭的新线程池,并将用于执行单个方法doMath(因此该池中只有一个线程将被使用)。

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

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

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

然后在“外部”上创建一个可能ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)) 的 ExecutionContext,并在您想在其上执行逻辑时使用它。

【讨论】:

  • 我怀疑...我将重构我的 doMath 然后尝试更改 ExecutionContext 以便我可以并行执行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2015-07-22
  • 2021-03-02
相关资源
最近更新 更多