web-dev-qa-db-ja.com

未来と約束の違いは何ですか?

未来と約束の違いは何ですか? (AkkaとGparsで。)

Getが呼び出され、futureの結果を取得することが約束されている場合、両方ともブロックし、futureの値を返すので、私には同じように見えます。

私は、GparsにもAkka/Javaにも精通していないので、Akka/Scalaについてお話します。

Scala 2.10、これにはAkkaの関連部分が標準配布に含まれています)、Futureは基本的に、まだ計算されていない値への読み取り専用の参照です。 Promiseはほとんど同じです書き込みもできることを除いて。つまり、FuturesとPromises、ただしPromisesにのみ書き込むことができます。Futureに関連付けられたPromiseは、そのfutureメソッドを呼び出すことで取得できますが、変換他の方向では不可能です(無意味なため)。

55

wikipediaによると 、これらは同じ概念です。

コンピュータサイエンスでは、future、promise、delayは、いくつかの並行プログラミング言語での同期に使用される構造を指します。それらは、通常はその値の計算がまだ不完全であるために、最初は不明である結果のプロキシとして機能するオブジェクトを記述します。

一部のライブラリは、それらを一方向で呼び出すことを選択する場合もあれば、別の方法で呼び出すことを選択する場合もあります。そして毎回、それらは異なるフレーバーで実装されるかもしれません。一部のライブラリーは、これらの同義語を使用して異なるフレーバーを区別することを選択する場合があります。これは悪い選択であると私は主張しますが(明らかにそれは人々を混乱させるため) このリンク はScalaこの一般的な慣行であると示唆しています。

@PtharienのFlameが示唆したように、Scala aではFutureは読み取り専用の操作ですが、Promiseは結果(または失敗)を生成する機能を提供します)それが表す操作の場合。

したがって、Promiseは、結果を伝播する操作を実行する責任のあるコードによって最もよく使用され、Futureは、結果をクライアントコードに公開して結果を待機するために使用されます。ただし、この区別はScala固有であり、部外者を混乱させる可能性があることに注意してください。

20
back2dos

ここでは、Javaで多くのFuturesで作業してきましたが、Scala/Akka開発にもバックグラウンドがあります。この回答は、と言われていますが、JVMで現在広く使用されている実装の多さを指摘します。

最初に、元の投稿者はgetとblockingの使用について言及しています-これをテスト以外で行わないでください。

私が現在の役割でFPと並行性の概念を教えるとき、最初に生徒に意味と約束と未来は同義語であることを伝えます。なぜなら、約束または未来のAPIの消費者として、開発者は必要ないからです。セマンティックの違いがあるかどうか、またはIFがある場合は、IOをブロックせずにそれらを処理するためのメカニズムのみを理解する。

Futureを完了できないこと、promiseができること(たとえば、scala/akka/play apisなど)を単純化しすぎると言うと:

一部の先物を完了することができます Java8は、CompletableFutureを標準ライブラリに導入しました。

一部のPromiseは完了できません同様に、Play Promise APIではPromiseを実行できませんが、RedeemablePromiseを使用すると、タイプセーフの傘の下でもPlayは異なるセマンティクスを導入できます。さらに、Play Promise APIはscala両方向の先物-(F.Promise.wrap(future)またはpromise.wrapped())で変換できます。

Java8でタイプセーフテクノロジーを使用すると、1つのAPIが望ましいという理由だけで、先物/約束の間を行き来することがよくあります(Play Promise APIは、Java8ラムダを使用する方がよいようです)。 Akka + Play + Java8では、アクターからフューチャーを取得し、それらをプロミスにラップし、コールバックを作成し、それをコントローラーから返します。

だから、私が教えるときに人々に言うように、約束と未来は多かれ少なかれ同義語です。

7
JasonG