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.
Antworten:
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,
Future
ist a im Wesentlichen eine schreibgeschützte Referenz auf einen noch zu berechnenden Wert. APromise
ist so ziemlich dasselbe, außer dass Sie auch darauf schreiben können . Mit anderen Worten, Sie können sowohl vonFuture
s als auch vonPromise
s lesen , aber Sie können nur nachPromise
s schreiben . Sie können dasFuture
assoziierte Element mit einemPromise
abrufen, indem Sie diefuture
Methode aufrufen. Eine Konvertierung in die andere Richtung ist jedoch nicht möglich (da dies unsinnig wäre).quelle
Laut Wikipedia sind sie das gleiche Konzept:
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
Future
eine schreibgeschützte Operation, während aPromise
Ihnen die Möglichkeit gibt, ein Ergebnis (oder einen Fehler) für die Operation zu erhalten, die es darstellt.A
Promise
wird daher am besten von dem Code verwendet, der für die Ausführung der Operation zur Verbreitung des Ergebnisses verantwortlich ist, während aFuture
verwendet 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.quelle
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.
quelle