clojure 未来与延迟

问题描述 投票:0回答:2

我一直在阅读《Clojure 编程》并发现了文本内容

(defn get-document [id]
; ... do some work to retrieve the identified document's metadata ... {:url "http://www.mozilla.org/about/manifesto.en.html"
:title "The Mozilla Manifesto"
:mime "text/html"
:content (delay (slurp "http://www.mozilla.org/about/manifesto.en.html"))})

如果调用者可能始终需要该数据,则替换未来延迟的变化可以证明吞吐量的显着提高。

我没有完全理解这部分,有人可以解释一下吗?

clojure delay future
2个回答
8
投票

简单回答

future
是body的后台执行,
delay
是body的按需执行。示例:如果您有 100 个
delay
代码的列表,并尝试循环遍历它 - 代码将在评估每个列表项(例如执行 HTTP 请求)时阻塞,并且第一次迭代会很慢。与
future
-d 代码相同 - 它将评估后台线程中的所有内容,并且结果将立即在循环中可用。

经验法则 - 如果很可能根本不需要部分或大部分内容 - 使用

delay
,否则使用
future

https://clojuredocs.org/clojure.core/delay https://clojuredocs.org/clojure.core/future


3
投票

future
创建一个
Future
并安排它立即执行,因此调用

(get-document "id")

将导致创建一个 future,它会立即获取文档,然后在将来缓存结果。

相反,

delay
创建一个惰性操作,在取消引用之前不会执行该操作。在这种情况下,请致电

(get-document "id")

不会导致文档被获取。仅当取消引用时才会发生这种情况,例如

(let [{:keys [content]} (get-document "id")]
  (println @content))
© www.soinside.com 2019 - 2024. All rights reserved.