未来と約束の違いは何ですか?(AkkaとGparsで。)
彼らはブロックと同じように見えますが、getが呼び出され、将来の結果を取得することが約束されているときに未来の値を返します。
未来と約束の違いは何ですか?(AkkaとGparsで。)
彼らはブロックと同じように見えますが、getが呼び出され、将来の結果を取得することが約束されているときに未来の値を返します。
回答:
Akka / Scalaについてお話します。GparsもAkka / Javaにも詳しくないからです。
標準ディストリビューションのAkkaの関連部分を含むScala 2.10では、a Future
は本質的に、まだ計算されていない値への読み取り専用の参照です。A Promise
は、同様に書き込むことができることを除いて、ほとんど同じです。つまり、Future
sとPromise
sの両方から読み取ることができますが、sにしか書き込むことができませんPromise
。メソッドを呼び出すことFuture
でaに関連付けられた値を取得できますが、他の方向への変換は不可能です(無意味だからです)。Promise
future
コンピューターサイエンスでは、future、promise、およびdelayは、一部の並行プログラミング言語で同期するために使用される構成体を指します。通常、値の計算がまだ不完全であるため、最初は不明な結果のプロキシとして機能するオブジェクトを記述します。
一部のライブラリは、ある方法で呼び出すことを選択する場合もあれば、別の方法で呼び出すことを選択する場合もあります。そして、毎回、異なるフレーバーで実装される場合があります。一部のライブラリでは、これらの同義語を使用して異なるフレーバーを区別する場合があります。私はこれが悪い選択だと主張しますが(明らかにそれは人々を混乱させるため)、このリンクはScalaでこの一般的な慣行を示唆しています。
@PtharienのFlameが示唆したように、Scalaではa Future
は読み取り専用操作Promise
ですが、a はそれが表す操作の結果(または失敗)を生成する機能を提供します。
Promise
したがって、A は結果を伝播する操作を実行するコードによって最適に使用され、a Future
は結果をクライアントコードに公開するために使用され、結果を待機します。ただし、この区別はScala固有のものであり、部外者を混乱させる可能性があることに注意してください。
ここで少し付け加えますが、私は最近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では、アクターからフューチャーを取得してプロミスにラップし、コールバックを作成して、コントローラーからそれを返します。
ですから、私が教えるときに人々に言うように、約束と未来は多かれ少なかれ同義語です。