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经过解引用获得结果。

做为一次性、单值的管道。

相关文章
相关标签/搜索