future

(future & body)

参数 body 接受一系列表达式,并返回一个 future 对象,使用 deref 或者 @ 可以对这个对象进行强迫求值。

future 对象会在另一个线程里对 body 进行求值,并将求值结果保存到缓存中,之后对这个 future 对象的所有强迫求值都会返回这个缓存值。

如果强迫求值时 body 的计算还没完成,那么调用者将被阻塞,直到计算完成,或者 deref 设置的过期时间到达为止。

; 普通的 future 调用

user=> (def f (future (+ 1 1)))
#'user/f

user=> f
#<core$future_call$reify__6110@fae040: 2>

user=> @f
2

; 一个停滞 5 秒的 future 调用

user=> @(future (println "start sleep") (Thread/sleep 5000) 10086)
start sleep
10086

; 一个带 timeout 的 deref 调用的例子,防止阻塞时间过长

user=> (deref (future (Thread/sleep 10000000000000000))
              1000
              "reach block timeout") ; 停滞 1 秒之后返回字符串值
"reach block timeout"

讨论

comments powered by Disqus

Previous topic

fn

Next topic

get