过去十几年CPU一直遵循着摩尔定律发展,单核频率越来越快,但是最近这几年,摩尔定律已然失效,CPU的工艺制程和发热稳定性之间难以取舍,取而代之的策略则是增加核心数量,目前家用电脑四核已经非常常见,服务器更是达到了32核64线程。为了有效地利用多核CPU,我们在代码层面就应该考虑到并发性。十几年的痛苦开发经历告诉我们,threads并不是获取并发性的好方法,往往会带来难以查找的bug,但是不用害怕,今天我们有很多其他方法来获得易用的并发性,比如我们接下来介绍的Actor模型。

模型 Model

Actor模型是一个概念模型,用于处理并发计算。它定义了一系列系统组件应该如何动作和交互的通用规则,最著名的使用这套规则的编程语言是Erlang。这篇文章更关注模型本身而不是它在不同语言的实现。

Actors

一个Actor指的是一个最基本的计算单元。它能接收一个消息并且基于其执行计算。

这个理念很像面向对象语言,一个对象接收一条消息(方法调用),然后根据接收的消息做事(调用了哪个方法)。

Actors一大重要特征在于actors之间相互隔离,它们并不互相共享内存。这点区别于上述的对象。也就是说,一个actor能维持一个私有的状态,并且这个状态不可能被另一个actor所改变。

聚沙成塔

One ant is no ant, one actor is no actor.
光有一个actor是不够的,多个actors才能组成系统。在actor模型里每个actor都有地址,所以它们才能够相互发送消息。

Actors有邮箱

只得指明的一点是,尽管许多actors同时运行,但是一个actor只能顺序地处理消息。也就是说其它actors发送了三条消息给一个actor,这个actor只能一次处理一条。所以如果你要并行处理3条消息,你需要把这条消息发给3个actors。

消息异步地传送到actor,所以当actor正在处理消息时,新来的消息应该存储到别的地方。Mailbox就是这些消息存储的地方。

Actors通过异步消息沟通,在处理消息之前消息被存放在Mailbox中

Actors做什么

当一个actor接收到消息后,它能做如下三件事中的一件:

Create more actors; 创建其他actors
Send messages to other actors; 向其他actors发送消息
Designates what to do with the next message. 指定下一条消息到来的行为
前两件事比较直观,第三件却很有意思。

我之前说过一个actor能维持一个私有状态。「指定下一条消息来到做什么」意味着可以定义下条消息来到时的状态。更清楚地说,就是actors如何修改状态。

设想有一个actor像计算器,它的初始状态是数字0。当这个actor接收到add(1)消息时,它并不改变它原本的状态,而是指定当它接收到下一个消息时,状态会变为1。

容错 Fault tolerance

Erlang 引入了「随它崩溃」的哲学理念,这部分关键代码被监控着,监控者的唯一职责是知道代码崩溃后干什么(如将这个单元代码重置为正常状态),让这种理念成为可能的正是actor模型。

每段代码都运行在process中,process是erlang称呼actor的方式。这个process完全独立,意味着它的状态不会影响其他process。我们有个supervisor,实际上它只是另一个process(所有东西都是actor),当被监控的process挂了,supervisor这个process会被通知并对此进行处理。这就让我们能创建「自愈」系统了。如果一个actor到达异常状态并崩溃,无论如何,supervisor都可以做出反应并尝试把它变成一致状态,这里有很多策略,最常见的是根据初始状态重启actor。

分布式 Distribution

另一个关于actor模型的有趣方面是它并不在意消息发送到的actor是本地的或者是另外节点上的。

转念一想,如果actor只是一些代码,包含了一个mailbox和一个内部状态,actor只对消息做出响应,谁会关注它运行在哪个机器上呢?只要我们能让消息到达就行了。这允许我们基于许多计算机上构建系统,并且恢复其中任何一台。

进一步了解

这里是一个快速的概念模型回顾,其中的概念被运用到许多知名语言和库中,比如Erlang和Elixir, Akka (for the JVM) 和 Celluloid (for Ruby)。

另外还有一个我自己使用C++实现的actors框架:
https://github.com/lkpworkspace/myframe.git

原文地址
翻译地址

10 分钟了解 Actor 模型相关推荐

  1. 不需要程序员,产品经理也能10分钟打造一个深度学习模型

    想要给产品加上图像识别或声音识别的AI能力需要做哪些工作? 第一步:定义和明确需求,第二步:采集和标注大量的数据,第三步:写算法.调参数,第四步:校验模型效果并持续反复第二步和第三步,第五步:将模型做 ...

  2. 数据分析初学者必备!10分钟搭建RFM客户价值模型,一学就会

    假设你是一家理财公司的市场运营,公司最近推出了一系列新产品,涵盖高.中.低三档,你手里有一份客户名册,你会如何向他们推广? 向所有客户发送统一的推广? 省时省力,但可想而知效果不佳...... 与每一 ...

  3. #今日论文推荐#1小时学会走路,10分钟学会翻身,世界模型让新生机器狗掌握多项技能

    #今日论文推荐#1小时学会走路,10分钟学会翻身,世界模型让新生机器狗掌握多项技能 人类宝宝在出生后的第1年里,就会逐渐掌握协调能力,学习坐.立.翻滚和爬行. 那么机器人呢? 机器人能完成多复杂的任务 ...

  4. 风控必备的评分卡模型,TempoAI 10分钟搞定

    8月20日,央行发布了<2020年第二季度支付体系运行总体情况>,数据显示,截至第二季度末,信用卡逾期半年未偿信贷总额838.84亿元,占信用卡应偿信贷余额的1.17%.与一季度相比,信用 ...

  5. 10分钟完成模型开发!合合信息智能文字识别服务平台亮相1024程序员节

    1024是2的十次方,也是二进制计数的基本计量单位之一,每年的10月24日因此成为了中国程序员的盛会.近期,CSDN(中国开发者网络)第三届"1024程序员节"(简称"大 ...

  6. 10分钟搭建你的第一个图像识别模型(附步骤、代码)

    作者:Pulkit Sharma 翻译:王威力 校对:丁楠雅 本文约3400字,建议阅读10分钟. 本文介绍了图像识别的深度学习模型的建立过程,通过陈述实际比赛的问题.介绍模型框架和展示解决方案代码, ...

  7. 10分钟内基于gpu的目标检测

    10分钟内基于gpu的目标检测 Object Detection on GPUs in 10 Minutes 目标检测仍然是自动驾驶和智能视频分析等应用的主要驱动力.目标检测应用程序需要使用大量数据集 ...

  8. java编程石头剪刀布图片_石头、剪刀、布!10分钟带你打开深度学习大门,代码已开源...

    原标题:石头.剪刀.布!10分钟带你打开深度学习大门,代码已开源 沉沉 发自 宇宙中心 量子位 出品 | 公众号 QbitAI 深度学习技术的不断普及,越来越多的语言可以用来进行深度学习项目的开发,即 ...

  9. 独家 | 10分钟带你上手TensorFlow实践(附代码)

    原文标题:TensorFlow Tutorial: 10 minutes Practical TensorFlow lesson for quick learners 作者:ANKIT SACHAN ...

最新文章

  1. java string 前缀匹配_字符串前缀和后缀匹配
  2. Redis系列教程(七):Redis并发竞争key的解决方案详解
  3. js中组装拼接json对象,通过java后端接收并解析
  4. BugkuCTF-MISC题where is flag3
  5. 【Flink】Flink 消费 kafka 实现 限流处理 RateLimiter
  6. python绘制如下图形、小三角形边长20_OpenGL学习脚印_ 绘制移动三角形 - 王定桥的专栏.pdf...
  7. 使用python原生态的min和max函数实现升序排序和降序排序
  8. Kloxo重启Web服务
  9. P2P文件快传测试用例
  10. AI语音合成软件免费的有哪些?常用的语音合成软件
  11. 【阅读笔记】Inverting Gradients -- How easy is it to break privacy in federated learning?
  12. 利用Powergui进行FFT Analysis,信号源为空解决方法
  13. ubuntu vscode c++生成so及调用调试so包
  14. 给大家分享一个QQ资料查询接口(等级,活跃,年龄,性别,身份卡)
  15. 1279C. Stack of Presents
  16. LeetCode:三数之和
  17. 员工与客户之间就是一个微信
  18. JavaWeb框架(一):Web入门,Http的请求和响应,https介绍,Web实战自定义服务器
  19. AWS使用(一)——申请付费版亚马逊云服务器的流程
  20. iOS连接外设的几种方式

热门文章

  1. Android .so文件引用
  2. 宜昌一中2021高考成绩查询,宜昌一中2020年高考再创佳绩!这个成绩令人赞叹!...
  3. 专网通信行业检测及认证服务介绍
  4. 微信小程序获取滚动条高度_小程序页面获取滚动条高度
  5. dom元素滚动条高度 js_js,jquery 获取滚动条高度和位置, 元素距顶部距离
  6. orcal四舍五入函数及取整数
  7. html modo1
  8. 搜索技术的秘密(一):概览
  9. 今天又学一招 vh和%的区别 vh的妙用
  10. 高并发之——缓存思路