2017-06-15 115 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