質問

先物と約束の両方が、彼らが彼らの値を計算するまでブロックするので、それらの違いは何ですか?

役に立ちましたか?

解決

Clojureの用語で答えると、以下の例がいくつかあります ショーン・デヴリンのスクリーンキャスト:

(def a-promise (promise))
(deliver a-promise :fred)

(def f (future (some-sexp)))
(deref f)

約束では、後の計算で選択した値を明示的に提供していることに注意してください(:fred この場合)。一方、未来は、それが作成されたのと同じ場所で消費されています。 some-expr おそらく舞台裏で発売され、タンデム(最終的に)で計算されますが、スレッドブロックが利用可能になるまでアクセスされるまでに平均化されたままである場合。


追加するために編集

約束と未来をさらに区別するために、次のことに注意してください。

約束

  1. あなたはaを作成します promise. 。その約束のオブジェクトは、任意のスレッドに渡すことができます。
  2. 計算を続けます。これらは、副作用、データのダウンロード、ユーザー入力、データベースアクセス、その他の約束を含む非常に複雑な計算です。コードは、どのプログラムでもメインラインコードによく似ています。
  3. 終了したら、できます deliver その約束のオブジェクトの結果。
  4. 試しているアイテム deref 計算が終了する前の約束は、完了するまでブロックされます。完了したら、 deliver約束を尽くして、約束はもうブロックされません。

将来

  1. あなたはあなたの未来を創造します。あなたの将来の一部は、計算の表現です。
  2. 将来は同時に実行される場合とそうでない場合があります。おそらくプールからスレッドを割り当てることができます。それはただ待って何もすることができませんでした。あなたの観点から わかりません.
  3. ある時点であなた(または別のスレッド) derefs未来。計算が既に完了している場合、その結果が得られます。それがまだ完了していない場合、あなたはそれがなるまでブロックします。 (おそらくそれがまだ開始されていない場合、 derefそれはそれが実行を開始することを意味しますが、これも保証されていません。)

あなたの間 たぶん......だろう 将来の表現を、約束の創造に続くコードと同じくらい複雑にします。それは望ましいことです。これは、先物は迅速で背景の計算により本当に適していることを意味しますが、約束は大きくて複雑な実行パスにより適しています。また、約束は、入手可能な計算の観点から、もう少し柔軟であり、作品をしているプロミスの作成者と収穫を刈り取る別のスレッドに向けられているようです。先物は、スレッドを自動的に開始する(ugい誤りがなくても、オーバーヘッドなしで)、そしてあなたが発信するスレッドが結果を必要とするまで他のことを続ける方向に向けられています。

他のヒント

未来と約束の両方は、非同期の結果を伝えるメカニズムです 計算 生産者から消費者へ。

の場合には 未来 計算 将来の創造時に定義され、非同期の実行は「できるだけ早く」始まります。また、非同期計算を発生させる方法を「知っている」。

の場合には 約束 計算, 、 これは 始まる時間 そして[可能な 非同期呼び出し 送達メカニズムから切り離されています。いつ 計算 結果が利用可能ですプロデューサーは呼び出す必要があります deliver 明示的に、それは生産者が制御することも意味します いつ 結果が利用可能になります。

にとって 約束 Clojureは同じオブジェクトを使用して設計上の間違いを犯します(の結果 promise 両方の生産(deliver)そして消費する(deref) 結果として 計算. 。これらは2つの非常に明確な機能であり、そのように扱う必要があります。

すでに優れた回答があるため、「使用方法」の要約のみを追加するだけです。

両方

約束または将来の作成は、すぐに参照を返します。この参照は、計算の結果が他のスレッドによって提供されるまで @/derefでブロックされます。

未来

未来を作成するとき、あなたは行われる同期ジョブを提供します。専用の未結合プールのスレッドで実行されます。

約束

約束を作成するとき、あなたは議論をしません。参照は、他の「ユーザー」スレッドに渡す必要があります。 deliver 結果。

まず、a Promise aです Future. 。あなたはとの違いを知りたいと思います Promise そしてa FutureTask.

a Future 現在知られていないが、将来知られている値を表します。

a FutureTask 将来的に発生する計算の結果を表します(おそらくスレッドプールで)。結果にアクセスしようとすると、計算がまだ発生していない場合は、ブロックされます。それ以外の場合、結果はすぐに返されます。計算が事前に指定されているため、結果の計算に関与する他の当事者はありません。

a Promise 将来的にはプロミー担当者によってプロミーに配信される結果を表します。この場合、あなたは約束であり、プロミサイヤーはあなたに与えた人です Promise 物体。に似ています FutureTask, 、前に結果にアクセスしようとした場合 Promise 満たされた、それはプロミスが満たすまでブロックされます Promise. 。一度 Promise 満たされると、あなたは常に同じ値を常にそしてすぐに得ます。とは異なります FutureTask, 、ここに関係する別のパーティーがあり、 Promise. 。別の当事者が計算を行い、 Promise.

その意味で、a FutureTask aです Promise あなたは自分自身に作りました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top