【发布时间】:2020-07-05 21:54:21
【问题描述】:
正在看clojure for the brave and true第9章底部的练习(特别是搜索多个引擎并返回每个引擎的第一个命中的最后一个)
我用 slurp 部分模拟了实际的搜索是这样的:
(defn search-for
[query engine]
(Thread/sleep 2000)
(format "https://www.%s.com/search?q%%3D%s", engine query))
并实现了这样的行为:
(defn get-first-hit-from-each
[query engines]
(let [futs (map (fn [engine]
(future (search-for query engine))) engines)]
(doall futs)
(map deref futs)))
(我知道这里的返回是一个列表,练习要求一个向量,但可以为此做一个into...)
但是当我在 REPL 中运行它时
(time (get-first-hit-from-each "gray+cat" '("google" "bing")))
在我添加 doall 后似乎需要 2 秒(因为 map 返回一个惰性序列,我认为除非我使用序列,否则任何期货都不会开始,(last futs) 似乎也有效)但是当我在 REPL 中使用 time 宏,它报告几乎没有时间消耗,即使它需要 2 秒:
(time (get-first-hit-from-each "gray+cat" '("google" "bing")))
"Elapsed time: 0.189609 msecs"
("https://www.google.com/search?q%3Dgray+cat" "https://www.bing.com/search?q%3Dgray+cat")
time 宏在这里发生了什么?
【问题讨论】:
标签: clojure future lazy-evaluation lazy-sequences