web-dev-qa-db-fra.com

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

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

Ils me ressemblent à la fois comme bloquant et retournant la valeur de l'avenir lorsque get est appelé et une promesse est d'obtenir le résultat d'un avenir.

Je vais parler 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, un Future est essentiellement une référence en lecture seule à une valeur encore à calculer. Un Promise est à peu près le même sauf que vous pouvez également y écrire. En d'autres termes, vous pouvez lire à la fois Futures et Promises, mais vous ne pouvez écrire que dans Promises. Vous pouvez obtenir le Future associé à un Promise en appelant la méthode future dessus, mais la conversion dans l'autre sens n'est pas possible (car ce serait absurde).

55
Ptharien's Flame

Selon wikipedia , ce 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 comme un 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 peuvent choisir 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 saveurs. Bien que je soutienne que c'est un mauvais choix (car il est évident que cela déroute les gens), ce lien suggère que dans Scala cette pratique courante).

Comme l'a suggéré @ Ptharien's Flame, dans Scala a Future est une opération en lecture seule, tandis que Promise vous donne la possibilité de produire un résultat (ou un échec) ) pour l'opération qu'il représente.

Un Promise est donc mieux utilisé par le code responsable de l'exécution de l'opération pour propager le résultat, tandis qu'un Future est utilisé pour l'exposer au code client, qui à son tour attendra le résultat. Mais encore une fois, veuillez noter que cette distinction est Scala spécifique et peut confondre les étrangers.

20
back2dos

J'ajouterai un peu ici parce que j'ai travaillé avec une pléthore de Futures dans Java récemment, mais j'ai également une formation en développement Scala/Akka. Cette réponse dupliquera principalement ce qui a été dit, mais soulignera la pléthore d'implémentations couramment utilisées aujourd'hui sur la JVM.

Tout d'abord, l'affiche originale mentionne l'utilisation de get et de blocage - veuillez ne jamais le faire en dehors des tests.

Lorsque j'enseigne FP et les concepts de concurrence dans mon rôle actuel, je dis d'abord à l'étudiant que les promesses sémantiques et les futurs sont synonymes car en tant que consommateur d'une promesse ou d'une future API, le développeur n'a pas besoin pour comprendre qu'il y a ou s'il y a des différences sémantiques - seulement la mécanique pour les manipuler sans bloquer les E/S.

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

Certains Futures peuvent être complétés Java8 introduit maintenant un CompletableFuture dans la bibliothèque standard.

Certaines promesses ne peuvent pas être terminées De même, dans l'API Play promise, une promesse ne peut pas être remplie, mais un RedeemablePromise peut donc jouer introduit une sémantique différente - même en étant sous l'égide de Typesafe. De plus, l'API Play promise peut convertir avec scala futures dans les deux sens - (F.Promise.wrap (future) ou promise.wrapped ()).

En travaillant avec la technologie Typesafe sur Java8, vous allez souvent faire des allers-retours entre les futurs/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 prendrez les futurs des acteurs et les encapsulerez dans des promesses, en composant des rappels et en les retournant du contrôleur.

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

7
JasonG