Clojure 并发实践: future 和 promise 处理异步返回值

栏目: 编程语言 · Clojure · 发布时间: 7年前

内容简介:Clojure 并发实践: future 和 promise 处理异步返回值

Clojure 的并发方面的详细介绍可以参考我过去总结的 wiki ——Clojure 并发。 这次又想写个系列,介绍下实际编程中对这些并发机制的应用。

不过,很可能不会涉及 STM。 LeanCloud 本质上是一个 web 型的应用,基础的并发模型已经由 web server 和后端存储决定了,STM 的适应场景没有出现过。

这一篇先从future 和 promise 开始。

最近处理这么一个任务,有一段业务代码要调用一个第三方接口来查询域名备案号,但是呢,这个第三方接口非常不稳定,经常查询出错或者超时,导致这个业务经常不可用。

(defn query-icp [domain]
     ;; HTTP 调用第三方接口 API 。
     (query-icp-from-thirdpaty1 domain))

为了提高这个接口的稳定性,我们引入另一个查询服务,想让两个服务来竞争,谁能返回正常结果,就用谁的。假设这个服务封装成了函数 query-icp-from-thirdpaty2

ok,我们先加个 or 上去

(defn query-icp [domain]
  (or
    (query-icp-from-thirdpaty1 domain)
    (query-icp-from-thirdpaty2 domain)))

先尝试从一个服务查询,如果没有返回就尝试第二个服务。

但是这样有个问题,第三方服务的调用我们是一定要设置一个超时的。这个 or 改动我们改变了 query-icp 的超时承诺,原来最多等待 query-icp-from-thirdpaty1 超时,现在可能遇到最高两倍的超时时间(假设两个服务都遇到超时),因为两个是顺序调用的,这肯定是不能接受的。

第一时间想到,我们将查询并发,启个线程去同时去查询两个服务,这时候就可以用 future 。其次,任何一个服务如果有结果返回,我们就使用它,不等另一个服务的结果。在 Java 里我们可以用 CountDownLatch 或者 CompletionService 。 在 Clojure 里我们可以用 promise + deliver。

(defn- do-query-icp [p f domain]
  (future
    (when-let [ret (f domain)]
      (deliver p ret))))

(defn query-icp [domain]
  (let [p (promise)]
    (do-query-icp p query-icp-from-thirdpaty1 domain)
    (do-query-icp p query-icp-from-thirdpaty2 domain)
    (deref p :5000 nil)))

do-query-icp 里我们利用 future 来异步调用接口,当接口有返回的时候,使用 deliver 将结果 ret 喂给 promise

而在 query-icp 里,我们先创建一个 promise,然后接连发起两次 do-query-icp 异步请求分别调用两个服务,然后利用 (deref p timeout-ms timeout-val) 等待结果,同时设置超时 5 秒和超时后的返回值 nil


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Android编程权威指南(第3版)

Android编程权威指南(第3版)

比尔·菲利普斯 (Bill Phillips)、克里斯·斯图尔特 (Chris Stewart)、克莉丝汀·马西卡诺 (Kristin Marsicano) / 王明发 / 人民邮电出版社 / 2017-6 / 129.00元

Big Nerd Ranch 是美国一家专业的移动开发技术培训机构。本书主要以其Android 训练营教学课程为基础,融合了几位作者多年的心得体会,是一本完全面向实战的Android 编程权威指南。全书共36 章,详细介绍了8 个Android 应用的开发过程。通过这些精心设计的应用,读者可掌握很多重要的理论知识和开发技巧,获得宝贵的开发经验。 第3 版较之前版本增加了对数据绑定等新工具的介......一起来看看 《Android编程权威指南(第3版)》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

MD5 加密
MD5 加密

MD5 加密工具