clojure 未来与延迟
clojure future vs delay
我一直在通读《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"))})
如果呼叫者可能总是需要该数据,则替换 future over delay 的变化可以证明是吞吐量的显着提高。
这部分我没有完全理解,谁能解释一下。
简单回答future
是body的后台执行,delay
是body的按需执行。示例:如果您有 100 个 delay
-ed 代码的列表,并尝试循环遍历它 - 代码将在评估每个列表项(例如执行 HTTP 请求)时阻塞,并且第一次迭代会很慢。与 future
-d 代码相同 - 它将评估后台线程中的所有内容,结果将在您的循环中立即可用。
经验法则 - 如果很有可能根本不需要部分或大部分内容 - 使用 delay
,否则使用 future
.
https://clojuredocs.org/clojure.core/delay
https://clojuredocs.org/clojure.core/future
future
创建一个 Future
并安排它立即执行,因此调用
(get-document "id")
将创建一个未来,它会立即获取文档,然后在未来缓存结果。
相比之下,delay
创建了一个惰性操作,在取消引用之前不会执行。在这种情况下,调用
(get-document "id")
不会导致获取文档。这只会在取消引用时发生,例如
(let [{:keys [content]} (get-document "id")]
(println @content))
我一直在通读《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"))})
如果呼叫者可能总是需要该数据,则替换 future over delay 的变化可以证明是吞吐量的显着提高。
这部分我没有完全理解,谁能解释一下。
简单回答future
是body的后台执行,delay
是body的按需执行。示例:如果您有 100 个 delay
-ed 代码的列表,并尝试循环遍历它 - 代码将在评估每个列表项(例如执行 HTTP 请求)时阻塞,并且第一次迭代会很慢。与 future
-d 代码相同 - 它将评估后台线程中的所有内容,结果将在您的循环中立即可用。
经验法则 - 如果很有可能根本不需要部分或大部分内容 - 使用 delay
,否则使用 future
.
https://clojuredocs.org/clojure.core/delay https://clojuredocs.org/clojure.core/future
future
创建一个 Future
并安排它立即执行,因此调用
(get-document "id")
将创建一个未来,它会立即获取文档,然后在未来缓存结果。
相比之下,delay
创建了一个惰性操作,在取消引用之前不会执行。在这种情况下,调用
(get-document "id")
不会导致获取文档。这只会在取消引用时发生,例如
(let [{:keys [content]} (get-document "id")]
(println @content))