Was ist der Unterschied zwischen einer Zukunft und einem Versprechen?

73

Was ist der Unterschied zwischen einer Zukunft und einem Versprechen? (In Akka und Gpars.)

Sie sehen für mich genauso aus wie Block und geben den Wert der Zukunft zurück, wenn get aufgerufen wird und das Versprechen besteht, das Ergebnis einer Zukunft zu erhalten.

Suminda Sirinath S. Dharmasena
quelle
4
"Zukunft verspricht Produzentenverbraucher". (Tauschen Sie zum Programmieren die letzten beiden aus, da Futures (null oder mehr) dem Verbrauch eines Werts entsprechen und Promise (nur der erste kann erfolgreich sein) dem Erzeugen eines Werts entspricht.)
rwong
Der großartige Vortrag über Zukunft / Versprechen auf coursera "Principles of Reactive Programming" von Martin Odersky, Erik Meijer und Roland Kuhn: class.coursera.org/reactive-001/lecture , Woche 3
GKislin
@rwong: "Zukunft verspricht Produzentenverbraucher" - oder? Ist dies ein aussagekräftiger Satz, der uns mnemonisch an den Unterschied zwischen Zukünften und Versprechungen erinnert? Mein Gehirn hat es völlig versäumt, es zu analysieren. Und du sagst auch, dass es falsch ist und dass man Wörter tauschen muss, aber aus irgendeinem Grund hast du das nicht einfach getan, bevor du es eingetippt hast. Und schließlich ist es in Anführungszeichen, aber googeln bringt keine anderen Treffer als Ihren Kommentar. Mega verblüfft.
Bacar

Antworten:

54

Ich werde über Akka / Scala sprechen, weil ich weder mit Gpars noch mit Akka / Java vertraut bin.

In Scala 2.10, in der der relevante Teil von Akka in der Standardverteilung enthalten ist, Futureist a im Wesentlichen eine schreibgeschützte Referenz auf einen noch zu berechnenden Wert. A Promiseist so ziemlich dasselbe, außer dass Sie auch darauf schreiben können . Mit anderen Worten, Sie können sowohl von Futures als auch von Promises lesen , aber Sie können nur nach Promises schreiben . Sie können das Futureassoziierte Element mit einem Promiseabrufen, indem Sie die futureMethode aufrufen. Eine Konvertierung in die andere Richtung ist jedoch nicht möglich (da dies unsinnig wäre).

Pthariens Flamme
quelle
19

Laut Wikipedia sind sie das gleiche Konzept:

In der Informatik beziehen sich Zukunft, Versprechen und Verzögerung auf Konstrukte, die für die Synchronisation in einigen gleichzeitig ablaufenden Programmiersprachen verwendet werden. Sie beschreiben ein Objekt, das als Proxy für ein zunächst unbekanntes Ergebnis fungiert, in der Regel, weil die Berechnung seines Werts noch unvollständig ist.

Einige Bibliotheken nennen sie möglicherweise auf eine Weise, andere auf eine andere. Und jedes Mal können sie in verschiedenen Geschmacksrichtungen implementiert werden. Einige Bibliotheken verwenden diese Synonyme möglicherweise, um verschiedene Geschmacksrichtungen zu unterscheiden. Während ich behaupten würde, dass dies eine schlechte Wahl ist (weil es offensichtlich die Menschen verwirrt), deutet dieser Link darauf hin, dass in Scala diese gängige Praxis.

Wie in @ Pthariens Flame vorgeschlagen, ist in Scala a Futureeine schreibgeschützte Operation, während a PromiseIhnen die Möglichkeit gibt, ein Ergebnis (oder einen Fehler) für die Operation zu erhalten, die es darstellt.

A Promisewird daher am besten von dem Code verwendet, der für die Ausführung der Operation zur Verbreitung des Ergebnisses verantwortlich ist, während a Futureverwendet wird, um es dem Client-Code zugänglich zu machen, der seinerseits auf das Ergebnis wartet. Beachten Sie jedoch auch hier, dass diese Unterscheidung Scala-spezifisch ist und Außenstehende verwirren kann.

back2dos
quelle
Dies gilt auch für JS Promises und Python Futures.
Nick Sweeting
6

Ich füge hier ein bisschen hinzu, weil ich in letzter Zeit mit einer Fülle von Futures in Java gearbeitet habe, aber auch einen Hintergrund in der Scala / Akka-Entwicklung habe. Diese Antwort wird größtenteils das Gesagte duplizieren, aber auf die Fülle von Implementierungen hinweisen, die heutzutage in der JVM häufig verwendet werden.

Erstens erwähnen Originalposter Get und Blocking - bitte tun Sie dies niemals außerhalb von Tests.

Wenn ich in meiner aktuellen Rolle FP- und Concurrency-Konzepte unterrichte, sage ich dem Schüler zuerst, dass semantische Versprechen und Zukünfte Synonyme sind, da der Entwickler als Konsument eines Versprechens oder einer zukünftigen API nicht verstehen muss, dass es solche gibt oder WENN es solche gibt semantische Unterschiede - nur die Mechanik für den Umgang mit ihnen, ohne IO zu blockieren.

Zu sagen, dass eine Zukunft nicht abgeschlossen werden kann und ein Versprechen (z. B. nach scala / akka / play apis), ist zu einfach:

Einige Futures können vervollständigt werden. Java8 führt jetzt eine CompletableFuture in die Standardbibliothek ein.

Einige Versprechungen können nicht erfüllt werden Ebenso kann in der Play Promise API eine Versprechung nicht erfüllt werden, aber eine RedeemablePromise kann so gespielt werden, dass eine andere Semantik eingeführt wird - selbst wenn Sie sich unter dem Typesafe-Dach befinden. Darüber hinaus kann Play Promise API mit Scala Futures in beide Richtungen konvertieren - (F.Promise.wrap (future) oder promise.wrapped ()).

Wenn Sie mit der Typesafe-Technologie auf Java8 arbeiten, wechseln Sie häufig zwischen Futures / Versprechungen hin und her, nur weil eine API vorzuziehen ist (die Play Promise-API scheint bei Java8-Lambdas besser zu sein). Auf Akka + Play + Java8 nehmen Sie die Zukünfte von Schauspielern und wickeln sie in Versprechungen ein, verfassen Rückrufe und geben diese vom Controller zurück.

Wenn ich den Leuten erzähle, dass ich unterrichte, sind Versprechen und Zukünfte mehr oder weniger Synonyme.

JasonG
quelle