clojure未来与延迟

时间:2015-03-11 11:46:35

标签: clojure delay future core

我一直在阅读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"))})

如果呼叫者可能总是需要这些数据,那么替换未来延迟的变化可以证明是吞吐量的显着改善。

我没有完全掌握这一部分,有人可以解释一下。

2 个答案:

答案 0 :(得分:6)

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

经验法则 - 如果根本不需要部分或大部分内容,请使用delay,否则请使用future

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

答案 1 :(得分:3)

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

(get-document "id")

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

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

(get-document "id")

不会导致提取文档。这只会在取消引用时发生,例如

(let [{:keys [content]} (get-document "id")]
  (println @content))