Скала Фьючерсы и Многопоточность
Я новичок в 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))
на "снаружи" и используйте его всякий раз, когда вы хотите выполнить логику на нем.