[解決済み] Clojureのフューチャーとプロミスはどう違うのか?
2023-03-15 04:15:33
質問
先物もプロミスも値を計算するまでブロックされますが、両者の違いは何でしょうか?
どのように解決するのですか?
Clojureの用語で答えると、次のような例があります。 Sean Devlinのスクリーンキャスト :
(def a-promise (promise))
(deliver a-promise :fred)
(def f (future (some-sexp)))
(deref f)
約束の中で、後の計算で選択する値を明示的に渡していることに注意してください (
:fred
この場合)。 一方、未来は作成された場所で消費されます。 そのため
some-expr
はおそらく裏で起動され、(最終的には)同時に計算されますが、アクセスされるまでに評価されないままであれば、スレッドはそれが利用可能になるまでブロックされます。
を追加するために編集されました。
約束と未来の区別をさらにつけるために、次のことに注意しましょう。
約束
-
を作成すると
promise
. そのプロミスオブジェクトは、これで任意のスレッドに渡すことができます。 - あなたは計算を続けます。 これらは,副作用,データのダウンロード,ユーザ入力,データベースアクセス,他のプロミスなどを含む非常に複雑な計算をすることができます -- お好きなように。 コードはどのプログラムでもメインラインのコードとほとんど同じように見えるでしょう。
-
終了したら、次のことができます。
deliver
を実行し、その結果をそのプロミスオブジェクトに渡します。 -
を試行するすべての項目は
deref
を試みるアイテムは、計算が終了するまでブロックされます。 いったん計算が終わってdeliver
を編集すると、プロミスはそれ以上ブロックされません。
未来
- あなたの未来を創るのはあなたです。 あなたの未来の一部は、計算のための表現です。
- 未来は同時に実行されるかもしれませんし、されないかもしれません。 スレッドが割り当てられ、プールから割り当てられるかもしれません。 何もせずに待つこともできます。 あなたの視点から を伝えることはできません。 .
-
ある時点で、あなた (または別のスレッド) は
deref
が未来を計算します。 もし計算が既に終了していれば、その結果を取得する。 まだ完了していない場合は、完了するまでブロックする。 (おそらくまだ始まっていない場合。deref
を実行し始めることを意味すると思われるが、これも保証されない)。
あなたが ができた はプロミスの生成に続くコードと同じくらい複雑な式を作ることができますが、それが望ましいかどうかは疑問です。 つまり,futureはバックグラウンドで素早く計算するのに向いていて,promiseは大規模で複雑な実行経路に向いているのです. また,プロミスは,利用可能な計算という点では,プロミス作成者が仕事をし,別のスレッドが収穫を得るという方向性で,もう少し柔軟性があるように思われます. Futuresは自動的にスレッドを開始し(醜くエラーを起こしやすいオーバーヘッドなしで)、あなた(開始したスレッド)が結果を必要とするまで他のことを続けることをより指向しています。
関連
-
[解決済み] jQueryのディファレンシャルとプロミス - .then() vs .done()
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] MVPとMVC、その違いは何ですか?
-
[解決済み] Subversionリポジトリにおける「branch」、「tag」、「trunk」の意味とは?
-
[解決済み] DTO、VO、POJO、JavaBeansの違い?
-
[解決済み】PromiseとObservablesの違いは何ですか?
-
[解決済み] useとrequireの違い
-
[解決済み] Lisp-1とLisp-2の違いは何ですか?
-
[解決済み] Clojureでは、リストタイプを変換する簡単な方法はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 実社会で活躍するLisp【クローズド
-
[解決済み] clojureプロトコルの簡単な説明
-
[解決済み] clojureで指数を計算するには?
-
[解決済み] Clojureのdoseqとforの違いについて
-
[解決済み] コンポジュール・ルートの "ビッグ・アイデア "とは?
-
[解決済み] clojureのキーワードを文字列に変換するには?
-
[解決済み] Lisp-1とLisp-2の違いは何ですか?
-
[解決済み] Clojureで遅延シーケンスを非遅延シーケンスに変換する方法
-
[解決済み] Clojureと他のLispsの比較 [終了しました]。
-
[解決済み] Clojureでは、リストタイプを変換する簡単な方法はありますか?