clojure的delay future promise

《Clojure編程》第4章筆記。編程

總的感受,Clojure畢竟是基於JVM的在人間的工程化語言。不是純的無狀態純函數的在神間的lisp。後端

做爲後端語言,不可避免要處理計算中和代碼執行時序、線程等方面的事情。promise

這方面Clojure有大量的概念和模式,讓這些問題儘可能地簡化。和其餘語言有相似的地方,可是確實有本身的特點。app

這些東西基本上都是用def定義爲模塊ns下的var。相似全局可變var。(固然,定義在let裏也是能夠的異步

delay future promise

相同點:函數

1異步執行裏面的語句,也就是不等待執行完,就繼續執行下面的spa

2 均可以經過@ 和deref解引用取得結果。若是在沒計算完以前解引用,產生阻塞效果。線程

   因此對解引用的執行者來講,不須要考慮被解引用的是什麼。code

解引用方式@ 和deref區別:

deref能夠設置超時時間和返回值,@不行。blog

deref能夠apply到整個序列,而@不行。

因此,簡單狀況用@ 須要考慮超時,或者集合操做的時候再用deref

delay能夠保持結果:

(def d (delay (println "running...") :done!))
(println (deref d))
(println @d)
running...
:done!
:done!

delay接受的是一堆代碼,把最後1個做爲返回值:done! 

兩次解引用,其實只計算了1次,第二次就直接用第一次計算後的結果了。適合1次計算,屢次使用的場合。

若是d已經被求值,能夠用(realized? d)進行判斷

future

(deref (future (Thread/sleep 2000) :done!) 100 :impatient!)

隱式使用一個線程異步計算一些東西,而後解引用返回結果。

這裏用了deref+超時 因此100ms就返回了:impatient!,不會等待2sec,返回:done!

promise

只聲明,不包含如何計算的代碼。

(def a (promise))

而後A經過deliver 投遞數據,  B經過解引用獲得結果。

做爲一次性、單值的管道。

相關文章
相關標籤/搜索