2017-06-15 10 views
0

私はスカラ座に新しいですし、私は先物のハンドルを取得しようと、私は行列Scalaの先物およびマルチスレッド

SingleThreadCalc { 
    def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = Future{doMath(matrix)} 
} 
上のいくつかの計算を行い、プログラムのSingleThreadedバージョンを持っている

をマルチスレッド化しています

私が今したいのは、マルチスレッド版を作ることです。 複数のスレッドで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今では行列の要素を繰り返し処理するためにdoubleを使用しています リファクタリングをライン処理 に考えていましたが、各スレッドの処理を終了するスレッドを制御できますか? – 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の実行を並列化したい場合、おそらくimplicit ec: ExecutionContextパラメータを使用してその定義内で使用することによって、ts定義を並列化できるように変更する必要があります。

しかし、あなたの代わりに並列にdoMathの多くの呼び出しを実行できるようにしたいならば、次の操作を実行できます。その後、

object MultiThreadCalc { 
    def run(matrix : Seq[Seq[Double]])(implicit ec: ExecutionContext) : Future[Seq[Seq[Double]] = Future{doMath(matrix)} 
} 

と「外」におそらくExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))をのExecutionContextを作成したときにそれを使用しますその上でロジックを実行したいとします。

+0

私はそれを疑っていました... 私はdoMathをリファクタリングし、実行を並列化できるようにExecutionContextを変更しようとします – tiefizzy

関連する問題