Qual è la differenza tra un futuro e una promessa? (In Akka e Gpars.)
Mi sembrano uguali sia come blocco che restituiscono il valore del futuro quando viene chiamato get e la promessa è di ottenere il risultato di un futuro.
Qual è la differenza tra un futuro e una promessa? (In Akka e Gpars.)
Mi sembrano uguali sia come blocco che restituiscono il valore del futuro quando viene chiamato get e la promessa è di ottenere il risultato di un futuro.
Risposte:
Parlerò di Akka / Scala, perché non ho familiarità con Gpars né con Akka / Java.
In Scala 2.10, che include la parte rilevante di Akka nella distribuzione standard, a Future
è essenzialmente un riferimento di sola lettura a un valore ancora da calcolare. A Promise
è praticamente lo stesso, tranne che puoi anche scriverci . In altre parole, puoi leggere sia da Future
s che da Promise
s, ma puoi scrivere solo a Promise
s. È possibile ottenere l' Future
associato con a Promise
chiamando il future
metodo su di esso, ma la conversione nell'altra direzione non è possibile (perché sarebbe priva di senso).
Secondo Wikipedia , sono lo stesso concetto:
In informatica, futuro, promessa e ritardo si riferiscono a costrutti usati per la sincronizzazione in alcuni linguaggi di programmazione simultanei. Descrivono un oggetto che funge da proxy per un risultato inizialmente sconosciuto, di solito perché il calcolo del suo valore è ancora incompleto.
Alcune biblioteche possono scegliere di chiamarle in un modo, alcune possono scegliere di chiamarle in un altro. E ogni volta, possono essere implementati in diversi gusti. Alcune biblioteche possono scegliere di usare questi sinonimi per distinguere sapori diversi. Mentre direi che questa è una cattiva scelta (perché evidentemente confonde le persone), questo collegamento suggerisce che in Scala questa pratica comune.
Come suggerito da @ Ptharien's Flame, in Scala a Future
è un'operazione di sola lettura, mentre a Promise
ti dà la possibilità di produrre un risultato (o un fallimento) per l'operazione che rappresenta.
A Promise
è quindi meglio utilizzato dal codice responsabile per eseguire l'operazione di propagazione del risultato, mentre a Future
viene utilizzato per esporlo al codice client, che a sua volta attende il risultato. Ma di nuovo, tieni presente che questa distinzione è specifica di Scala e può confondere gli estranei.
Aggiungerò un po 'qui perché ho lavorato con una pletora di Futures in Java negli ultimi tempi ma ho anche un background nello sviluppo di Scala / Akka. Questa risposta duplicherà principalmente ciò che è stato detto, ma metterà in evidenza la pletora di implementazioni di uso popolare oggi sulla JVM.
Innanzitutto, i poster originali menzionano l'utilizzo di get e blocking: per favore non farlo mai al di fuori dei test.
Quando insegno concetti di FP e concorrenza nel mio ruolo attuale, per prima cosa dico allo studente che le promesse semantiche e i futuri 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 l'IO.
Dire che un futuro non può essere completato e che una promessa (ad 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 promessa di gioco una promessa non può essere adempiuta, ma un riscattoPromise può quindi giocare introduce una semantica diversa, anche se si trova sotto l'ombrello Typesafe. Inoltre, l'API di promessa Play può essere convertita con i futures scala in entrambe le direzioni - (F.Promise.wrap (future) o promise.wrapped ()).
Lavorando con la tecnologia Typesafe su Java8 andrai spesso avanti e indietro tra future / promesse semplicemente perché è preferibile un'API (Play Promise API sembra migliore con Java8 lambdas). Su Akka + Play + Java8 prenderai i futuri dagli attori e li avvolgerai in promesse, componendo callback e restituendoli dal controller.
Quindi, come dico alle persone quando insegno, Promesse e Futuri sono più o meno sinonimi.