《Clojure编程》第4章笔记。

总的感觉,Clojure毕竟是基于JVM的在人间的工程化语言。不是纯的无状态纯函数的在神间的lisp。

作为后端语言,不可避免要处理计算中和代码执行时序、线程等方面的事情。

这方面Clojure有大量的概念和模式,让这些问题尽量地简化。和其他语言有类似的地方,但是确实有自己的特色。

这些东西基本上都是用def定义为模块ns下的var。类似全局可变var。(当然,定义在let里也是可以的

delay future promise

相同点:

1异步执行里面的语句,也就是不等待执行完,就继续执行下面的

2 都可以通过@ 和deref解引用取得结果。如果在没计算完之前解引用,产生阻塞效果。

所以对解引用的执行者来说,不需要考虑被解引用的是什么。

解引用方式@ 和deref区别:

deref可以设置超时时间和返回值,@不行。

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 ) :done!)  :impatient!)

隐式使用一个线程异步计算一些东西,然后解引用返回结果。

这里用了deref+超时 所以100ms就返回了:impatient!,不会等待2sec,返回:done!

promise

只声明,不包含如何计算的代码。

(def a (promise))

然后A通过deliver 投递数据,  B通过解引用得到结果。

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

clojure的delay future promise的更多相关文章

  1. folly教程系列之:future/promise

         attension:本文严禁转载. 一.前言 promise/future是一个非常重要的异步编程模型,它可以让我们摆脱传统的回调陷阱,从而使用更加优雅.清晰的方式进行异步编程.c++11中 ...

  2. Future Promise 模式(netty源码9)

    netty源码死磕9  Future Promise 模式详解 1. Future/Promise 模式 1.1. ChannelFuture的由来 由于Netty中的Handler 处理都是异步IO ...

  3. based on Greenlets (via Eventlet and Gevent) fork 孙子worker 比较 gevent不是异步 协程原理 占位符 placeholder (Future, Promise, Deferred) 循环引擎 greenlet 没有显式调度的微线程,换言之 协程

    gevent GitHub - gevent/gevent: Coroutine-based concurrency library for Python https://github.com/gev ...

  4. 使用 Vert.X Future/Promise 编写异步代码

    Future 和 Promise 是 Vert.X 4.0中的重要角色,贯穿了整个 Vert.X 框架.掌握 Future/Promise 的用法,是用好 Vert.X.编写高质量异步代码的基础.本文 ...

  5. The promises and challenges of std::async task-based parallelism in C++11 C++11 std::async/future/promise

    转载 http://eli.thegreenplace.net/2016/the-promises-and-challenges-of-stdasync-task-based-parallelism- ...

  6. Future与Promise

    https://code.csdn.NET/DOC_Scala/chinese_scala_offical_document/file/Futures-and-Promises-cn.md#ancho ...

  7. 并发编程(三)Promise, Future 和 Callback

    并发编程(三)Promise, Future 和 Callback 异步操作的有两个经典接口:Future 和 Promise,其中的 Future 表示一个可能还没有实际完成的异步任务的结果,针对这 ...

  8. nodejs 8 利用原生 util.promisify() 实现 promise.delay()

    Nodejs 8 在 util 包里新增了 promisify() .这个方法基本和 bluebird 的 promisify() 作用一样,即把最后一个参数是 callback 函数的函数变成返回 ...

  9. Netty 中的异步编程 Future 和 Promise

    Netty 中大量 I/O 操作都是异步执行,本篇博文来聊聊 Netty 中的异步编程. Java Future 提供的异步模型 JDK 5 引入了 Future 模式.Future 接口是 Java ...

随机推荐

  1. lua基础学习(六)

    一.lua协同程序coroutine 1.什么是协同(coroutine)?Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共 ...

  2. discuz 设置

    veikei_dz_com_20120821_gray_free 模板  论坛 瀑布流 需要在后台设置  论坛--板块管理--编辑对应板块--扩展设置--开启图片列表模式 FAQ 帮助页面 在后台管理 ...

  3. SCP,scp linux2台机器之间如何传输文件

    关键词:scp 转自: http://blog.csdn.net/gatieme https://blog.csdn.net/gatieme/article/details/51673229 scp传 ...

  4. Luogu P2612 [ZJOI2012]波浪

    题目 我们考虑从\(1\)到\(n\)把每个数放到序列里面去,以消掉绝对值. 在最后的序列中,如果\(i\)的某一边是序列的边界,那么\(i\)会产生\(0\)的贡献.如果\(i\)的某一边是一个比\ ...

  5. linux 内核数据结构之红黑树.

    转载: http://www.cnblogs.com/haippy/archive/2012/09/02/2668099.html https://zh.wikipedia.org/zh/%E7%BA ...

  6. sys模块&json模块&pickle模块

    sys模块&json模块&pickle模块 sys模块 一.导入方式 import sys 二.作用 与Python解释器交互 三.模块功能 3.1 经常使用 sys.path #返回 ...

  7. 常用的PHP函数封装,有排序和数据库操作函数

    //二分查找 function bin_sch($array, $low, $high, $k) { if ($low <= $high) { $mid = intval(($low + $hi ...

  8. java8之stream和lambda表达式

    JAVA 8 已经推出有一段时间了, 相比之前, 我们操作集合的方式应该是这样? 代码:List<String> list = new ArrayList<>(); list. ...

  9. js 判断图片和视频是否加载成功

    图片: 失败: // 方法 1:更换图片地址 $('img').error(function(){ $(this).attr('src', '加载失败.png'); }); // 方法 2:隐藏它 $ ...

  10. 在springboot中集成mybatis开发

    在springboot中利用mybatis框架进行开发需要集成mybatis才能进行开发,那么如何在springboot中集成mybatis呢?按照以下几个步骤就可以实现springboot集成myb ...