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.
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.
Réponses:
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 Future
est essentiellement une référence en lecture seule à une valeur non encore calculée. A Promise
est à peu près la même chose sauf que vous pouvez aussi y écrire . En d'autres termes, vous pouvez lire à la fois Future
s et Promise
s, mais vous ne pouvez écrire que sur Promise
s. Vous pouvez obtenir le Future
associé à a Promise
en appelant la future
méthode dessus, mais la conversion dans l'autre sens n'est pas possible (car ce serait absurde).
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 Future
est en lecture seule, tandis que un Promise
vous donne la possibilité de générer un résultat (ou un échec) pour l'opération représentée.
Il Promise
est 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 Future
est 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.
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.