我正在尝试了解Clojure期货,并且我已经看到了常见的Clojure书中的例子,并且有一些例子将期货用于并行计算(这似乎是有道理的)。
但是,我希望有人可以解释一个改编自O'Reilly编程Clojure书的简单例子的行为。
(def long-calculation (future (apply + (range 1e8))))
当我尝试取消引用时,通过
(time @long-calculation)
它返回正确的结果(4999999950000000),但几乎立即(在0.045毫秒内)在我的机器上。
但是当我调用实际函数时,就像这样
(time (apply + (range 1e8)))
我也得到了正确的结果,但所花费的时间要大得多(约5000毫秒)。
当我取消引用未来时,我的理解是创建了一个新的线程,在该线程上评估表达式 - 在这种情况下,我预计它也需要大约5000毫秒。
为什么解除引用的未来会如此迅速地返回正确的结果?
答案 0 :(得分:11)
未来的计算会在您创建未来后立即开始(在单独的线程中)。在您的情况下,只要您执行(def long-calculation ....)
取消引用将执行以下两项操作之一:
您可以通过比较以下内容来查看效果:
;; dereference before future completes
(let [f (future (Thread/sleep 1000))]
(time @f))
=> "Elapsed time: 999.46176 msecs"
;; dereference after future completes
(let [f (future (Thread/sleep 1000))]
(Thread/sleep 2000)
(time @f))
=> "Elapsed time: 0.039598 msecs"