Qual è la differenza tra un futuro e una promessa? (In Akka e Gpars.)
Mi sembrano uguali sia come blocchi che come ritorno del valore del futuro quando viene chiamato get e una promessa è ottenere il risultato di un futuro.
Qual è la differenza tra un futuro e una promessa? (In Akka e Gpars.)
Mi sembrano uguali sia come blocchi che come ritorno del valore del futuro quando viene chiamato get e una promessa è ottenere il risultato di un futuro.
Parlerò di Akka / Scala, perché non ho familiarità con Gpars o con Akka / Java.
In Scala 2.10, che include la parte rilevante di Akka nella distribuzione standard, un Future
è essenzialmente un riferimento di sola lettura a un valore non ancora calcolato. Un Promise
è praticamente lo stesso tranne che puoi scriverci anche . In altre parole, puoi leggere sia Future
se Promise
s, ma puoi scrivere solo su Promise
s. Puoi ottenere il Future
associato a Promise
chiamando il metodo future
su di esso, ma la conversione nell'altra direzione non è possibile (perché sarebbe senza senso).
Secondo wikipedia , sono lo stesso concetto:
In computer science, future, promise, and delay refer to constructs used for synchronizing in some concurrent programming languages. They describe an object that acts as a proxy for a result that is initially unknown, usually because the computation of its value is yet incomplete.
Alcune biblioteche possono scegliere di chiamarle in un modo, alcuni possono sceglierne altre. E ogni volta, possono essere implementati in diversi gusti. Alcune biblioteche possono scegliere di utilizzare questi sinonimi per distinguere sapori diversi. Mentre direi che questa è una scelta sbagliata (perché evidentemente confonde le persone), questo link suggerisce che in Scala questa pratica comune.
Come suggerito da @ Ptharien's Flame, in Scala un Future
è un'operazione di sola lettura, mentre un Promise
ti dà la possibilità di produrre un risultato (o un fallimento) per l'operazione che rappresenta.
Un Promise
viene quindi utilizzato al meglio dal codice responsabile per eseguire l'operazione per propagare il risultato, mentre un Future
viene utilizzato per esporlo al codice client, che a sua volta attenderà il risultato. Ma ancora una volta, tieni presente che questa distinzione è specifica per Scala e potrebbe confondere gli estranei.
Aggiungerò un po 'qui perché ho lavorato con una pletora di Futures in Java ultimamente, ma ho anche uno sfondo nello sviluppo di Scala / Akka. Questa risposta duplicherà per lo più ciò che è stato detto, ma metterà in evidenza la pletora di implementazioni in uso popolare oggi sulla JVM.
Per prima cosa, il poster originale menziona usando get e blocking - per favore non farlo mai al di fuori dei test.
Quando insegno i concetti FP e Concurrency nel mio ruolo attuale, prima dico allo studente che promesse semanticamente e futures sono sinonimi perché come consumatore di una promessa o di una futura API, lo sviluppatore non ha bisogno di capire che ci sono o Se ci sono differenze semantiche - solo la meccanica per gestirle senza bloccare IO.
Dire che un futuro non può essere completato e che una promessa può (per esempio per scala / akka / play apis per esempio) è troppo semplicistico:
Alcuni Futures possono essere completati Java8 ora introduce un CompletableFuture nella libreria standard.
Alcune promesse non possono essere completate Allo stesso modo, nell'API di promessa di gioco non è possibile soddisfare una promessa, ma una regola di riscatto in grado di riprodurre una semantica diversa - anche se è sotto l'ombrello del typesafe. Inoltre, l'API di promessa di gioco può convertire con scala future in entrambe le direzioni: (F.Promise.wrap (futuro) o promise.wrapped ()).
Lavorando con la tecnologia Typesafe su Java8 andrai spesso avanti e indietro tra futures / promesse semplicemente perché è preferibile una sola API (l'API Play Promise sembra migliore con Java8 lambdas). Su Akka + Play + Java8 prenderai i futuri dagli attori e li trasformerai in promesse, componendo i callback e restituendoli dal controller.
Quindi, come dico alle persone quando insegno, Promises e Futures sono più o meno sinonimi.