2016-03-07 10 views
5

z dobrze napisany Akka Concurrency:Akka Future - Równolegle kontra współbieżne?

enter image description here

Jak Rozumiem diagram wskazuje zarówno numSummer i charConcat będzie działać na tym samym wątku.

Czy jest możliwe równoległe uruchamianie każdego Future, tj. Na oddzielnych wątkach?

+2

Prawdopodobnie postać powinna być nazywany „Flatma pitting jednocześnie z sekwencyjnie ", ponieważ lewy jest równoczesnym ... – mdm

+0

Ale" współbieżny "oznacza ponowne użycie tego samego wątku, nie? –

+0

Niekoniecznie, o ile rozumiem. http://stackoverflow.com/questions/1897993/difference-between-concurrent-programming-and-parallel-programming lub https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming; sekwencyjne byłoby wtedy, gdy nie ma nakładania się między wykonaniami. – mdm

Odpowiedz

11

Zdjęcie po lewej stronie: to jeżdżą równolegle.

Punktem przykładu jest to, że metoda Future.apply jest tym, co rozpoczyna wykonywanie, więc jeśli nie nastąpi, dopóki wynik pierwszej przyszłości nie zostanie zmieniony na flatMap (jak na obrazku po prawej), to nie robisz tego. t uzyskać równoległe wykonanie.

(Zauważ, że przez „skopany”, to znaczy odpowiedni ExecutionContext dowiaduje się o pracę. Jak to parallelizes to inna kwestia i może zależeć od rzeczy, jak na wielkość puli wątków.)

kod Odpowiednik dla lewej:

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

i do prawej:

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) 
     } 
    }