《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. python 并发编程 进程池与线程池

    一 进程池与线程池 1.为什么需要进程池和线程池 基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是: 服务端的程序运行在一台机器身上,一台机器性能是有极限的,不能无限开线程 服务的 ...

  2. vultr vps 开启BBR加速 (CentOS 7)

    上个月买的vultr的vps 感觉看视频还是比较慢的 于是上网找教程开启BBR加速 在这里记录一下 以后可能会用到 BBR 是 Google 提出的一种新型拥塞控制算法,可以使 Linux 服务器显著 ...

  3. [转帖]VPS、虚拟主机、云主机的区别

    引用知乎网友通俗的例子解释: https://www.cnblogs.com/fjping0606/p/9993849.html 其实 应该是 vps 只是 单台物理机上面的虚拟机 云主机 可能是资源 ...

  4. urllib库:解析链接

    1from urllib.parse import urlparse, urlunparse, urlsplit, urlunsplit, urljoin, urlencode, parse_qs,  ...

  5. Spring(五)--autowire自动装配和spel

    autowire自动装配和spel 1.需要的实体类 2.需要的配置文件 <?xml version="1.0" encoding="UTF-8"?> ...

  6. Spring(二)--Spring入门案例

    Spring入门案例 1.需要的实体类 2.需要的接口和实现类 3.需要的service和实现类 /** * service层的作用 * 在不改变dao层代码的前提下,增加业务逻辑操作 */ publ ...

  7. Mysql 表空间和 数据页空洞

    一.表空间1.表空间: innodb 引擎存储的最高层: 存放所有的数据2.独立表空间:Mysql 版本 5.6 后默认开启的单表单空间(1)Innodb 默认存储引擎页的大小为 16K :默认表空间 ...

  8. python-day13(正式学习)

    闭包函数 闭包 闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量的引用).闭包指的是:函数内部函数对外部作用域而非全局作用域的引用. 额...这里提示一下闭包!=自 ...

  9. [Vue] vue的一些面试题3

    1. vue 组件里的定时器要怎么销毁? 当生命周期销毁后,并没有将组件中的计时器销毁,虽然页面上看不出来,但是如果在控制台打印的话,会发现计时器还在运行,所以要销毁计时器,避免代码一直执行 cons ...

  10. NSIS打包软件使用

    NSIS打包软件使用 最近做的一个调用远程桌面的小应用需要打个安装包,并且在安装的时候需要添加注册表,我之前使用的都是"Advanced Installer"来打包应用程序的,这个 ...