2016-03-07 8 views
5

Von den gut geschriebenen Akka Concurrency:Akka Future - Parallel versus simultan?

enter image description here

Wie ich verstehen, zeigt das Diagramm aus, sowohl numSummer und charConcat auf dem gleichen Thread ausgeführt wird.

Ist es möglich, jede Future parallel zu betreiben, d. H. Auf separaten Threads?

+2

Argumentieren, sollte die Zahl genannt werden „Flatma pping gleichzeitig versus sequentiell ", vorausgesetzt, dass die linke die gleichzeitige ist. – mdm

+0

Aber" gleichzeitig "impliziert die Wiederverwendung des gleichen Threads, nein? –

+0

Nicht unbedingt, soweit ich es verstehe. http://stackoverflow.com/questions/1897993/difference-between-concurrent-programming-and-parallel-programming oder https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming; sequentiell wäre, wenn es keine Überschneidungen zwischen den Ausführungen gibt. – mdm

Antwort

11

Das Bild auf der linken Seite ist sie parallel laufen.

Der Punkt der Abbildung ist, dass die Future.apply Methode ist es, was die Ausführung startet, also wenn es nicht geschieht, bis das Ergebnis der ersten Zukunft flatMap ed (wie im Bild rechts) ist, können Sie dann don‘ t bekomme die parallele Ausführung.

(Beachten Sie, dass durch „gekickt“, meine ich die relevanten ExecutionContext über den Job erzählt. Wie es parallelisiert ist eine andere Frage und kann auf Dinge wie die Größe des Thread-Pool ab.)

Equivalent-Code für links:

val numSummer = Future { ... } // execution kicked off 
val charConcat = Future { ... } // execution kicked off 
numSummer.flatMap { numsum => 
    charConcat.map { string => 
    (numsum, string) 
    } 
} 

und für das Recht:

Future { ... } // execution kicked off 
    .flatMap { numsum => 
    Future { ... } // execution kicked off (Note that this does not happen until 
        // the first future's result (`numsum`) is available.) 
     .map { string => 
     (numsum, string) 
     } 
    }