2017-06-15 2 views
0

Ich bin neu in Scala und ich versuche, einen Griff auf Futures zu erhalten und MultithreadingScala Futures und Multithreading

ich eine SingleThreaded Version eines Programms haben, das einige Berechnungen auf einer Matrix macht

SingleThreadCalc { 
    def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = Future{doMath(matrix)} 
} 

Was ich jetzt möchte, ist eine Multithread-Version davon zu machen. ist es genug, um nur einen ExecutionContext mit einer Anzahl von Threads zu übergeben?

MultiThreadCalc { 
    def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = 
Future{doMath(matrix)} (ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))) 

Wird sich die Berechnungslast zwischen allen Threads teilen oder geschieht dies überhaupt nicht?

+0

Die kurze Antwort, die ich geben würde, ist "anscheinend so", aber ich denke, die beste Antwort würde vom Laufen des Dinges und dem Messen kommen. – stefanobaghino

+0

Ich denke, der erste Schritt für Sie, wenn Sie Ihre doMath in Aufgaben zusammenführen, die parallel ausgeführt werden können. – jamborta

+0

@jamborta jetzt ist es ein Doppel für iterieren über die Elemente der Matrix Ich dachte über Refactoring zu Zeile Verarbeitung aber kann ich kontrollieren, welcher Thread endet die Verarbeitung jeder Zeile? – tiefizzy

Antwort

1

Kurze Antwort: Nein.

Lange Antwort:

object MultiThreadCalc { 
def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = 
    Future{doMath(matrix)}(ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))) 
} 

Der obige Code, für jeden Aufruf von run, wird einen neuen Thread-Pool zuweisen, die nie heruntergefahren werden, und es wird verwendet werden, um eine einzelne Methode auszuführen doMath (so wird nur 1 Thread in diesem Pool verwendet werden).

Wenn Sie jetzt die Ausführung von doMath selbst parallelisieren möchten, müssen Sie die ts-Definition so ändern, dass sie parallelisierbar ist, indem Sie möglicherweise einen -Parameter verwenden und diesen in seiner Definition verwenden.

Aber wenn Sie stattdessen viele Anrufungen von doMath parallel laufen zu können, dann können Sie folgendes tun:

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

Und dann eine ExecutionContext erstellen möglicherweise ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)) auf „außen“ und es zu benutzen, wann immer Sie möchten Logik darauf ausführen.

+0

Ich vermutete, dass ... Ich meine DoMath umgestalten und dann versuchen, den ExecutionContext zu ändern, damit ich die Ausführung parallelisieren kann – tiefizzy