2017-06-15 165 views
0

我是新来斯卡拉,我试图让期货的手柄和多线程斯卡拉期货和多线程

我有一个程序的版本的SingleThreaded,使得在矩阵的一些计算

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

这将共享所有线程之间的计算负载还是根本没有发生?

+0

我会给出的简短答案是“显然是如此”,但我认为最好的答案将来自运行该事物并测量。 – stefanobaghino

+0

我认为如果要将doMath分解为可以并行执行的任务,那么请考虑第一步。 – jamborta

+0

@jamborta现在它是迭代矩阵的元素的两倍 我正在考虑重构到行处理 但我可以控制哪个线程结束处理每一行? – tiefizzy

回答

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))并使用它时,你想执行它的逻辑。

+0

我怀疑... 我会重构我的doMath,然后尝试更改ExecutionContext,以便可以并行执行 – tiefizzy