2016-03-07 29 views
5

Dal ben scritto Akka Concurrency:Akka Future - Parallelo contro Concurrent?

enter image description here

Come comprendo, il diagramma sottolinea, sia numSummer e charConcat verrà eseguito sullo stesso filo.

È possibile eseguire ogni Future in parallelo, vale a dire su thread separati?

+2

Probabilmente, la cifra dovrebbe essere chiamato "Flatma pping concurrently versus sequential ", dato che quello sinistro è quello simultaneo .... – mdm

+0

Ma' concurrent' implica il riutilizzo dello stesso thread, no? –

+0

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

risposta

11

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