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)
}
}
Prawdopodobnie postać powinna być nazywany „Flatma pitting jednocześnie z sekwencyjnie ", ponieważ lewy jest równoczesnym ... – mdm
Ale" współbieżny "oznacza ponowne użycie tego samego wątku, nie? –
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