Qual è la differenza tra un futuro e una promessa?


73

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.


4
"Il futuro promette ai consumatori produttori". (Ma per la programmazione, scambia gli ultimi due perché Futures (zero o più) è analogo al consumo di un valore e Promise (con solo il primo in grado di avere successo) è analogo alla produzione di un valore.)
rwong

La fantastica conferenza sul futuro / le promesse sul corso "Principi di programmazione reattiva" di Martin Odersky, Erik Meijer, Roland Kuhn: class.coursera.org/reactive-001/lecture , Settimana 3
GKislin,

@rwong: "Il futuro promette ai consumatori produttori" - eh? Vuol dire che questa è una frase significativa che agisce come un mnemonico per ricordarci la differenza tra futuri e promesse? Il mio cervello non ha assolutamente analizzato. E stai anche dicendo che è sbagliato e ha bisogno di scambiare le parole, ma per qualche motivo non l'hai appena fatto prima di digitarlo. E infine è tra virgolette, ma cercare su Google non fa altro che il tuo commento. Mega-sconcertato.
bacar

Risposte:


54

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 Futures che da Promises, ma puoi scrivere solo a Promises. È possibile ottenere l' Futureassociato con a Promisechiamando il futuremetodo su di esso, ma la conversione nell'altra direzione non è possibile (perché sarebbe priva di senso).



19

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 Promiseti 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 Futureviene 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.


Questo vale anche per JS Promises e Python Futures.
Nick Sweeting,

6

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.