2016-11-13 3 views
1

ich diesen CodeAusführen für das Verständnis parallel

def getParallelList[T](list : List[T]) : ParSeq[T] = { 
    val parList = list.par 
    parList.tasksupport = new ForkJoinTaskSupport(new scala.concurrent.forkjoin.ForkJoinPool(10)) 
    parList 
} 

for { 
    a <- getList1 
    b <- getList2 
    c = b.calculateSomething 
    d <- getParallelList(getList3) 
} { ... } 

Ich möchte wissen, geschrieben, wenn dies eine gute (oder am besten) Art und Weise der for-Schleife zu machen parallel ausführen? Oder sollte ich Futures innerhalb der Schleife explizit programmieren?

Ich testete dies und es schien zu funktionieren ... aber ich bin mir nicht sicher, ob dies der beste Weg ist ... auch ich bin besorgt, was mit den Werten von a, b, c für verschiedene Threads von d passiert . Wenn ein Thread früher fertig ist? ändert es den Wert von a, b, c für andere?

+0

Ich sollte die for-Schleife parallel über Scheiben von d ausführen, in jedem von ihnen mit dem gleichen a, b, c. Es gibt kein Problem damit, solange a, b, c unveränderlich sind (d. H. Ihr Wert sollte sich auf keinen Fall ändern). – JulienD

Antwort

3

Wenn getList3 referenziell transparent ist, dh es wird jedes Mal, wenn es aufgerufen wird, den gleichen Wert zurückgeben, ist es besser, es einmal zu berechnen, da das Aufrufen von .par auf einer Liste es zu einem ParVector machen muss (n) (da Liste eine verknüpfte Liste ist und nicht sofort in eine Vector-Struktur konvertiert werden kann). Hier ist beispielsweise:

val list3 = getParallelList(getList3) 
for { 
    a <- getList1 
    b <- getList2 
    c = b.calculateSomething 
    d <- list3 
} { ... } 

In dem für das Verständnis, die Werte für (a, b, c) wird die gleiche bleiben während der Verarbeitung von d-Werten.

Um eine optimale Leistung zu erzielen, sollten Sie in Erwägung ziehen, getList1 oder getList2 parallel zu machen, je nachdem, wie gleichmäßig die Arbeit für a/b/c-Werte aufgeteilt ist.

Verwandte Themen