FutureとPromiseの違いは何ですか?


73

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

彼らはブロックと同じように見えますが、getが呼び出され、将来の結果を取得することが約束されているときに未来の値を返します。


4
「将来は生産者と消費者を約束します」。(先物(ゼロ以上)値の消費に類似しており、()が成功することだけ最初のものとの約束が値を生成することに類似しているので、しかし、プログラミングのために、最後の二つを入れ替える。)
rwong

:マーティン・オーダーズキー、エリック・マイヤー、ローランド・クーンによってコーセラの未来/約束「リアクティブプログラミングの原則」についての素晴らしい講演class.coursera.org/reactive-001/lecture、週3
GKislin

@rwong:「将来は生産者と消費者を約束する」-ハァッか。これは、未来と約束の違いを思い出させるためのニーモニックとして機能する意味のある文であることを意味していますか?私の脳はそれを完全に解析できませんでした。また、あなたはそれが間違っていると言葉を交換する必要があると言っていますが、何らかの理由であなたはそれを入力する前にこれをやったことがありません。そして最後に引用符で囲まれていますが、グーグルで検索してもコメント以外はヒットしません。メガバッフル。
bacar

回答:


54

Akka / Scalaについてお話します。GparsもAkka / Javaにも詳しくないからです。

標準ディストリビューションのAkkaの関連部分を含むScala 2.10では、a Futureは本質的に、まだ計算されていない値への読み取り専用の参照です。A Promiseは、同様に書き込むことができることを除いて、ほとんど同じです。つまり、FuturesとPromisesの両方から読み取ることができますが、sにしか書き込むことができませんPromise。メソッドを呼び出すことFutureでaに関連付けられた値を取得できますが、他の方向への変換は不可能です(無意味だからです)。Promisefuture



19

ウィキペディアよると、それらは同じ概念です:

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

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

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

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


これは、JS PromisesおよびPython Futuresにも当てはまります。
ニックスウィート

6

ここで少し付け加えますが、私は最近Javaで多数のFutureに取り組んできましたが、Scala / Akka開発のバックグラウンドも持っています。この答えは、言われたことの大部分を複製しますが、JVMで現在一般的に使用されている実装の多さを指摘します。

最初に、元のポスターにはgetとブロックを使用することが記載されています-テスト以外でこれを実行しないでください。

現在の役割でFPおよび同時実行性の概念を教えるとき、最初に、意味的に約束と未来が同義語であることを学生に伝えます。なぜなら、約束または将来のAPIの消費者として、開発者は、または存在することを理解する必要がないからです意味の違い-IOをブロックせずにそれらを処理するためのメカニズムのみ。

未来は完成できず、約束は(たとえばscala / akka / play apisのように)単純すぎると言うには:

一部のFutureを完了できます Java8では、標準ライブラリにCompletableFutureが導入されました。

一部の Promiseは完了できません同様に、Play promise APIでは、Promiseは満たすことはできませんが、RedeemablePromiseでは、Typesafeの傘下であっても、異なるセマンティックを導入できます。さらに、Play promise APIは、両方向(F.Promise.wrap(future)またはpromise.wrapped())のscala先物で変換できます。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.