Скала Фьючерсы и Многопоточность

Я новичок в 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)))

Будет ли это распределять вычислительную нагрузку между всеми потоками или это вообще не будет происходить?

1 ответ

Решение

Краткий ответ: Нет.

Длинный ответ:

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)}
}

А затем возможно создать ExecutionContext ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)) на "снаружи" и используйте его всякий раз, когда вы хотите выполнить логику на нем.

Другие вопросы по тегам