Quelle est la différence entre un futur et une promesse?


73

Quelle est la différence entre un futur et une promesse? (En Akka et Gpars.)

Ils me ressemblent car ils bloquent et renvoient la valeur du futur lorsque get est appelé et que la promesse est d'obtenir le résultat d'un avenir.


4
"L'avenir promet aux producteurs consommateurs". (Mais pour la programmation, permutez les deux derniers parce que Futures (zéro ou plus) est analogue à la consommation d'une valeur, et Promise (seul le premier capable de réussir) est analogue à la production d'une valeur.)
rwong

La conférence impressionnante sur l'avenir / les promesses de coursera "Principes de la programmation réactive" de Martin Odersky, Erik Meijer, Roland Kuhn: class.coursera.org/reactive-001/lecture , Semaine 3
GKislin

@ rwong: "L'avenir promet aux producteurs consommateurs" - hein? Est-ce que cela est censé être une phrase significative qui sert de mnémonique pour nous rappeler la différence entre les futurs et les promesses? Mon cerveau a totalement échoué à l'analyser. Et vous dites également que c'est faux et qu'il faut échanger des mots, mais pour une raison quelconque, vous ne l'avez pas encore fait avant de le taper. Et finalement, il est entre guillemets, mais googler n'apporte aucun autre résultat que votre commentaire. Méga-dérouté.
bacar

Réponses:


54

Je parlerai d'Akka / Scala car je ne connais ni Gpars ni Akka / Java.

Dans Scala 2.10, qui inclut la partie pertinente d’Akka dans la distribution standard, a Futureest essentiellement une référence en lecture seule à une valeur non encore calculée. A Promiseest à peu près la même chose sauf que vous pouvez aussi y écrire . En d'autres termes, vous pouvez lire à la fois Futures et Promises, mais vous ne pouvez écrire que sur Promises. Vous pouvez obtenir le Futureassocié à a Promiseen appelant la futureméthode dessus, mais la conversion dans l'autre sens n'est pas possible (car ce serait absurde).



19

Selon Wikipédia , ils sont le même concept:

En informatique, avenir, promesse et délai font référence aux constructions utilisées pour la synchronisation dans certains langages de programmation simultanés. Ils décrivent un objet qui agit en tant que proxy pour un résultat initialement inconnu, généralement parce que le calcul de sa valeur est encore incomplet.

Certaines bibliothèques peuvent choisir de les appeler d'une manière, d'autres de les appeler d'une autre. Et chaque fois, ils peuvent être mis en œuvre dans différentes saveurs. Certaines bibliothèques peuvent choisir d’utiliser ces synonymes pour distinguer différentes variétés. Bien que je soutienne que c'est un mauvais choix (parce que, évidemment, cela déroute les gens), ce lien suggère que cette pratique courante est à Scala.

Comme l'a suggéré @ Ptharien's Flame, en Scala, une opération Futureest en lecture seule, tandis que un Promisevous donne la possibilité de générer un résultat (ou un échec) pour l'opération représentée.

Il Promiseest donc préférable d’utiliser A pour que le code responsable exécute l’opération de propagation du résultat, tandis que a Futureest utilisé pour l’exposer au code client, qui attend ensuite le résultat. Mais encore une fois, veuillez noter que cette distinction est spécifique à Scala et peut confondre les étrangers.


C'est également le cas pour JS Promises et Python Futures.
Nick Sweeting

6

J'ajouterai quelques mots car je travaille depuis peu avec une pléthore de contrats à terme en Java, mais j'ai également une expérience du développement Scala / Akka. Cette réponse dupliquera en grande partie ce qui a été dit, mais soulignera la pléthore d'implémentations couramment utilisées aujourd'hui sur la JVM.

Premièrement, l’affiche originale mentionne l’utilisation de get et de blocage - veuillez ne jamais le faire en dehors des tests.

Lorsque j'enseigne les concepts de PF et de concurrence dans mon rôle actuel, je dis d'abord à l'étudiant que somes, promesses et futurs sont synonymes car, en tant que consommateur d'une promesse ou d'une future API, le développeur n'a pas besoin de comprendre qu'il y en a ou SI, différences sémantiques - seuls les mécanismes permettant de les manipuler sans bloquer les entrées / sorties.

Dire qu'un avenir ne peut pas être achevé et qu'une promesse peut (par exemple, selon scala / akka / play apis par exemple) est trop simpliste:

Certains contrats à terme peuvent être terminés. Java8 introduit maintenant un CompletableFuture dans la bibliothèque standard.

Certaines promesses ne peuvent pas être réalisées De la même manière, dans l'API de promesse de jeu, une promesse ne peut être remplie, mais une promesse remboursable peut alors jouer, ce qui introduit une sémantique différente, même sous le parapluie Typesafe. En outre, l'API de promesse de jeu peut convertir avec des futures de scala dans les deux sens - (F.Promise.wrap (future) ou promise.wrapped ()).

En utilisant la technologie Typesafe sur Java8, vous ferez souvent des aller-retours entre futures / promesses simplement parce qu’une API est préférable (l’API Play Promise semble meilleure avec les lambdas Java8). Sur Akka + Play + Java8, vous allez prendre les contrats à terme des acteurs et les inclure dans des promesses, composer des rappels et les restituer au contrôleur.

Donc, comme je le dis aux gens quand j'enseigne, Promesses et Futures sont plus ou moins synonymes.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.