[英]Scala Futures and Multithreading
我是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定义修改为可并行化,可能是使其采用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))
,并在您要对其执行逻辑时使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.