L'immagine a sinistra è in parallelo.
Il punto del illustrazione è che il metodo Future.apply
è quello che prende il via l'esecuzione, per cui se non accade fino risultato del primo futuro è flatMap
ed (come nella foto a destra), allora si don' t ottenere l'esecuzione parallela.
(Si noti che per "dato il via", voglio dire il relativo ExecutionContext
è detto circa il lavoro. Come è parallelizza è una domanda diversa e può dipendere cose come le dimensioni del suo pool di thread.)
codice equivalente per la sinistra:
val numSummer = Future { ... } // execution kicked off
val charConcat = Future { ... } // execution kicked off
numSummer.flatMap { numsum =>
charConcat.map { string =>
(numsum, string)
}
}
e per il diritto:
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)
}
}
fonte
2016-03-07 16:45:32
Probabilmente, la cifra dovrebbe essere chiamato "Flatma pping concurrently versus sequential ", dato che quello sinistro è quello simultaneo .... – mdm
Ma' concurrent' implica il riutilizzo dello stesso thread, no? –
Non necessariamente, per quanto ho capito. http://stackoverflow.com/questions/1897993/difference-between-concurrent-programming-and-parallel-programming o https://blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming; sequenziale sarebbe quando non vi è alcuna sovrapposizione tra le esecuzioni. – mdm