背景

Actor 模型 是让 Earlang 声名卓著的关键特性。它是 Erlang 平台实现分布式编程的关键内容,在 Clojure 语言设计时, Rich Hickey 考虑过在 Clojure 语言中是否实现 Actor,他最终认为:这仅仅是适合于分布式编程的一种特征,如果成为语言的本质,将限制 Clojure 成为一种服务器领域语言,因此他决定使用其他更简单直接的异步通信模型。但他也没有排除未来在 Clojure 中引入 Actor 的可能。

简单实现

随着 core.async 库的推出和成熟,我们实际上已经可以用 core.async 来实现一个最简单的 Actor 模型:

(require '[clojure.core.async :as a])(defn actor [f](let [mail-box (a/chan (a/dropping-buffer 32))](a/go-loop [f f](when-let [v (a/<! mail-box)](recur (f v))))mail-box))(def ! a/put!) ;erlang 的操作符

可以看到,上面的 actor 函数可以将一个 core.async 通道封装成一个主动单元,其中拥有自己的事件循环,不断地在 mail-box 上等待新的消息。

下面我们定义一个简单的调试 actor:

(def debug-actor (actor (fn debug[x] (prn x) debug)))(! debug-actor "Hello, world!")
;;输出 Hello, world

这最简单的 actor 当然还没有支持分布式编程,但使用这个模型,我们将程序的组件变成了主动的单元,从而在通道的基础上提供了另一种抽象。

与 Transducers 的关系

Clojure 1.7 开始引入的 transducer 被广泛使用,它可以使用在任何连续的数据结构上,例如序列,以及 core.async 的通道,如果我们已经定义好了一个 transducer 或者用它定义的操作 (xf),是否可以用于 Actor 呢?

(defn actor-xf [xf out-actor](let [f-out (fn([b] b)([b itm] (a/put! b itm) b))](fn f-actor([v] (f-actor out-actor v))([acc v](let [acc ((xf f-out) acc v)](partial f-actor acc))))))

这个函数可以用定义好的 xf 生成一个 actor,它将对消息处理后将转化后的消息送往 out-actor。例如:

(def inc-actor (actor (actor-xf (map inc) debug-actor)))
(! inc-actor 6)
;;输出7
(def complex-actor (actor (actor-xf (mapcat #(repeatedly % vector)) debug-actor)))
(! complex-actor 2)
;;[]
;;[]

其实 core.async 库中已经实现了类似的功能,就是 chan 函数本身!我们不过需要用 pipe 函数将内外两个通道连起来就可以了:

(defn actor-xf[xf out-ch](let [ch (a/chan (a/dropping-buffer 32) xf)](a/pipe ch out-ch)ch))

clojure 中使用 actor相关推荐

  1. 在.NET中实现Actor模型的不同方式

    上周,<实现领域驱动设计>(Implementing Domain-Driven Design)一书的作者Vaughn Vernon,发布了Dotsero,这是一个使用C#编写的.基于.N ...

  2. [unreal4入门系列之七] UE4中的Actor类和Pawn类

    现在我们开始进入UE4的代码开发工作.首先,UE4的类框架是非常庞大的,看起来有点让人措手不及.不过正因为UE4的类框架很完善,有很多常用的代码(函数和类)是已经提供给我们了,我们只需要简单地调用来完 ...

  3. 用例图中的Actor(参与者)一定是人吗?

    用例图中的Actor(参与者)一定是人吗?答案是否定的! 参考: 参与者不是特指人,是指系统以外的,在使用系统或与系统交互中所扮演的角色.因此参与者可以是人,可以是事物,也可以是时间或其他系统等等.还 ...

  4. kotlin半生对象_如何在Kotlin中使用Actor实现对象池

    kotlin半生对象 by osha1 由osha1 如何在Kotlin中使用Actor实现对象池 (How to implement an Object-Pool with an Actor in ...

  5. 用例图USE CASE中的Actor之眼让你不再雾里看花

    叙说一个IT从业30多年的程序猿是如何从技术中领悟到世间之理,并4次成功创业的感悟! 叙说程序猿眼中的人文世界,分享的主题如下: 程序那点事:用例图中的Actor之眼 程序猿人生:建设银行分布式面向对 ...

  6. java cons_java – 使用cons在Clojure中的对集合

    我正在基于Eratosthenes的Sieve在Clojure中编写一个Sieve类型的函数-..并且遇到了对列表的错误:ClassCastException clojure.lang.Cons无法强 ...

  7. Akka之在IoT系统中使用Actor(一)

    (一)IoT系统介绍 通过了解Actor的层次结构和行为,剩下的问题是如何将IoT系统的顶层组件映射到actor.将代表设备和仪表板的Actor放在顶层可能很诱人.相反,我们建议创建一个代表整个应用程 ...

  8. scala中akka actor例子

    抛开复杂的业务逻辑,让我们从一个超级简单的例子学习Akka Actor的用法. Scala cookbook的作者Alvin Alexander在他的网站上提供了两个例子. 本文翻译.整理于他的两篇文 ...

  9. Akka系列(二):Akka中的Actor系统

    Actor模型作为Akka中最核心的概念,所以Actor在Akka中的组织结构也至关重要,本文主要介绍Akka中Actor系统. Actor系统 Actor作为一种封装状态和行为的对象,总是需要一个系 ...

最新文章

  1. 二值化网络如何训练?这篇ICML 2021论文给你答案
  2. ASP.NET 2.0实现自带TreeView的客户端连带选择
  3. 巧用Windows server 2008密码重置盘
  4. python csv转excel_使用 Python 把 PDF 转为 CSV 和 Excel(一)
  5. AngularJS+RequireJS集成环境
  6. 32位选择进位加法器_32位加减法器设计
  7. MySQL HINT:Straight_JOIN
  8. Android开发学习之路-指纹识别api
  9. arcgis api for javascript创建webmap
  10. linux服务器和客户端配置,Linux基础教程:YUM服务端与客户端配置步骤
  11. tx2 fpga pcie无法读写_Cyclone V SOC(ARM+FPGA)开发文档_之开发流程详解
  12. Asp.net AJAX JavaScript 基本类型扩展(7)——String 类型及其扩展
  13. python学习day33 hmac模块 socketserver模块
  14. 【自动化__持续集成】___java___猜数字
  15. 服务器c盘logs文件夹,c盘的logs文件夹有什么用
  16. # 变转速轴承数据 时频图数据集制作(2)
  17. 试题 算法提高 盾神与条状项链
  18. 一文读懂《理解未来的7个原则》
  19. C语言做的猜数字小游戏
  20. AutoJs 4.1.1 实战教程、Hamibot

热门文章

  1. 全球第三位艾滋病痊愈者出现,靠脐带血干细胞新疗法抵抗病毒,此前已患病9年...
  2. IBM谢东:2nm芯片可让手机4天一充电,量子计算机大规模应用的未来不会太远|MEET2022...
  3. 蓝色起源送90岁《星际迷航》舰长扮演者上太空,刷新太空旅客最高年龄纪录...
  4. AI已经会刷LeetCode了
  5. AI给老照片上色,真的准吗?技术圈和历史圈吵了1000帖
  6. 孙正义的软银愿景宫斗内幕:印度裔高管争宠,黑公关手段,设局桃色仙人跳...
  7. Lyft开源L5自动驾驶数据集:55000个人工标注的3D注释框架,还有高清空间语义地图...
  8. vue本地项目静态资源管理
  9. dedecms 页面无刷新调取
  10. Android手机刷recovery