Domanda

Sia i futures e le promesse bloccano fino a quando non hanno calcolato i loro valori, quindi qual è la differenza tra loro?

È stato utile?

Soluzione

Risposta in termini Clojure, ecco alcuni esempi di di Sean Devlin screencast :

(def a-promise (promise))
(deliver a-promise :fred)

(def f (future (some-sexp)))
(deref f)

Si noti che nella promessa si consegnano in modo esplicito un valore che si seleziona in un calcolo più tardi (:fred in questo caso). Il futuro, d'altra parte, viene consumato nello stesso luogo che è stato creato. Il some-expr è presumibilmente lanciato dietro le quinte e calcolato in tandem (eventualmente), ma se rimane non valutata dal momento in cui si accede ai blocchi di filettatura finché non è disponibile.


A cura di aggiungere

Per aiutare ulteriormente distinguere tra una promessa e un futuro, notare quanto segue:

promettere

  1. Si crea un promise. Quell'oggetto promessa può ora essere passato a qualsiasi discussione.
  2. Si continua con i calcoli. Questi possono essere i calcoli molto complicati che coinvolgono gli effetti collaterali, scaricare i dati, l'input dell'utente, l'accesso al database, altre promesse - quello che vuoi. Il codice sarà molto simile il codice mainline in qualsiasi programma.
  3. Al termine, è possibile deliver i risultati a quell'oggetto promessa.
  4. Qualsiasi elemento che cerca di deref la tua promessa, prima hai finito con il calcolo bloccherà fino a quando il gioco è fatto. Una volta che hai finito e hai delivered la promessa, la promessa non bloccherà più.

futuro

  1. È possibile creare il vostro futuro. Parte del vostro futuro è un'espressione per il calcolo.
  2. Il futuro può o non può eseguire contemporaneamente. Potrebbe essere assegnato un filo, eventualmente da un pool. Poteva solo aspettare e non fare nulla. Dal tuo punto di vista non si può dire .
  3. Ad un certo punto (o un altro thread) derefs il futuro. Se il calcolo si è già completato, si ottengono i risultati di essa. Se non è già completato, è bloccare fino a quando non ha. (Presumibilmente se non è ancora iniziata, derefing significa che si inizia ad eseguire, ma anche questo non è garantito.)

Mentre si potrebbe rendere l'espressione in futuro così complicato come il codice che segue la creazione di una promessa, è dubbio che è desiderabile. Ciò significa che future sono davvero più adatti al rapido, fondo-grado calcoli mentre promesse sono davvero più adatte ai grandi percorsi di esecuzione, complicata. Troppo, promesse sembrano, in termini di calcolo a disposizione, un po 'più flessibile e orientata verso il creatore promessa facendo il lavoro e un altro thread mietere il raccolto. Futures sono più orientate verso l'avvio automatico di un filo (senza il sovraccarico brutto e soggetto a errori) e andando avanti con altre cose fino a quando - il filo originario -. Bisogno dei risultati

Altri suggerimenti

Sia futuro e promessa sono meccanismi per comunicare risultato asincrono calcolo dal produttore al consumatore (s).
In caso di Future calcolo è definita al momento della creazione del futuro ed esecuzione asincrona inizia "ASAP". E 'anche "sa" come per deporre le uova un calcolo asincrono.
In caso di promessa calcolo , il suo start time e [possibile] asincrono invocazione sono disaccoppiati dal meccanismo di distribuzione . Quando calcolo risultato è disponibile Producer deve chiamare deliver esplicitamente, che significa anche che i controlli Producer quando risultato diventa disponibile.
Per promesse Clojure sbaglia disegno utilizzando lo stesso oggetto (risultato della chiamata promise) sia prodotti (deliver) e consumare (deref) il risultato di calcolo . Si tratta di due funzioni ben distinte e devono essere trattati come tali.

Ci sono già ottime risposte in modo che solo l'aggiunta del "Come usare" Riepilogo:

Entrambi

La creazione di rendimenti promessa o future un riferimento immediato. Questo blocca riferimento sulla @ / deref fino risultato di calcolo è fornito da altro thread.

Futuro

Quando si crea il futuro si prevede un lavoro sincrono da fare. E 'eseguito in un thread dal pool illimitata dedicato.

Promessa

Si dà nessun argomento durante la creazione di promessa. Il riferimento dovrebbe essere fatto passare ad un'altra discussione 'utente' che deliver il risultato.

In primo luogo, un Promise è un Future. Penso che si desidera conoscere la differenza tra un Promise e FutureTask.

Un Future rappresenta un valore che non è attualmente noto, ma sarà conosciuto in futuro.

A FutureTask rappresenta il risultato di un calcolo che accadrà in futuro (forse in qualche pool di thread). Quando si tenta di accedere al risultato, se il calcolo non è ancora successo, blocca. In caso contrario, il risultato viene restituito immediatamente. Non v'è nessun altro partito coinvolto nel calcolo del risultato come il calcolo è specificato da voi in anticipo.

Un Promise rappresenta un risultato che sarà consegnato dal che promette al promissario in futuro. In questo caso, tu sei il promissario e che promette è quello che ti ha dato l'oggetto Promise. Simile al FutureTask, se si tenta di accedere al risultato prima che il Promise è stata soddisfatta, esso viene bloccato fino alla che promette soddisfa il Promise. Una volta che il Promise è soddisfatta, si ottiene lo stesso valore sempre e subito. A differenza di un FutureTask, c'è un altro partito in questione qui, uno che ha reso il Promise. Che un altro partito è responsabile per fare il calcolo e soddisfare la Promise.

In questo senso, un FutureTask è un Promise hai fatto a te stesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top