技术再深入一点又何妨?一脸懵B的聊Actor

本文深入浅出地介绍了Actor模型的概念,探讨了其在解决分布式编程问题中的应用,以及与传统线程通信机制的区别。通过类比高中时期写信的例子,生动解释了Actor模型中消息传递的机制,并以WordCount程序为例,展示了如何将任务分解为不同的Actor进行处理。

【这是一猿小讲的第 36 篇原创分享】

记得上次深入 Resin 源码时,见到了Actor 字眼,当时主要从 Resin 中抽取关键架构,就屏蔽了 Actor 相关代码。未曾想这两天研究 flink 的运行架构以及源码,再次与 Actor 邂逅,唯恐你们也在趟坑,索性今天就在猿门开坛设法,我们一起学习一下 Actor 模型。


好了,请准备好小板凳,我们的分享开始。

为了让你集中精力,咱们先抛个面试题一起玩一玩,看看你能不能答上来?

问题:能否说说线程之间是如何通信的?

元芳:咋一听,心中估计一万只草泥马飞奔而过。

640?wx_fmt=jpeg

答:

  1. 线程的通信是指线程之间以何种机制来交换信息。在编程中,线程之间的通信机制有两种,共享内存和消息传递。(给你10分)

  2. 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信。(给你5分)

  3. 但是一旦共享变量变得多起来,并且涉及到多种不同线程对象的交互,这种管理会变得非常复杂,极容易出现死锁等问题。(给你10分)

  4. 在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信,消息传递最有名的方式应该是 Actor 模型了。(给你5分)

那重点就来了,剩下的 70 分哪里去啦?

各位看官莫着急,我调皮的把剩余的分数分配给了:什么是 Actor 模型呢?(给70分)

640?wx_fmt=png

各部门注意!灯光道具准备!下面让我们有请 Actor 登场。

其实 Actor 模型并非新鲜物种,它是由 Carl Hewitt 于上世纪 70 年代早期提出,主要是为了解决分布式编程中,一系列的编程问题。

Don’t communicate by sharing memory, share memory by communicating。

不要通过共享内存来通信,而应该通过通信来共享内存。

大家应该对 OOP 面向对象编程,或多或少都了解过。其中核心思想是「Every thing is Object,一切皆是对象」。而我们经常使用类和对象进行建模。


而 Actor 模型的理念则惊人的相似「天下万物皆是 Actor」。通过不同Actor之间的消息传递实现模块之间的通信和交互。

OMG!说了这么多,这么生涩,难懂,依然还是没有没搞懂啊!那到底什么是 Actor 模型呢?

640?wx_fmt=png

如上图所示一个简单的 Actor 模型系统,其中 Actor 是最小的单元模块,系统由多个 Actor 组成。每个 Actor 有两个东西,一个是邮箱(MailBox);一个是自身的状态(state)。同时 Actor 具有接收和发送功能,Actor 与 Actor 之间只能通过消息(Message)通讯。

状态(state):Actor 中的状态指的是 Actor 对象的变量信息,状态由 Actor 自己管理,避免了并发环境下的锁和内存原子性等问题。

邮箱(MailBox):作为一个消息队列。邮箱是 Actor 和 Actor 之间的通信桥梁,邮箱内部通过 FIFO 消息队列来存储发送方 Actor 消息,接受方 Actor 从邮箱队列中获取消息。

消息(Message):消息是不可变的, 它的发送都是异步的,其中用 MailBox 来缓存消息。

说到这,不得不举一个不太恰当,但是却很应景的栗子。高中时给姐姐写信的场景。当时上高中时我还没有用过手机、也很少上网,大家都流行写信。所以我与姐姐经常靠写信来互报平安,偶尔姐姐也会在信封中夹几十块钱的零用钱给我,现在想想每次打开信封都开心。每次我写好信,只需根据姐姐的地址把信投寄到相应的信箱中,具体邮局系统是如何帮我送达给姐姐的,其实我也不清楚,姐姐收到信后,也会根据我的地址投寄到对应的信箱中,我也会收到姐姐的回复的信件。

解说一下,信件就相当于 Actor 模型中的消息(Message),Actor 与 Actor 之间通过消息进行通信;信箱就相当于 Actor 模型中的 MailBox;事情的参与者就相当于系统中 Actor。

到这一步,大概对 Actor 模型有了初步的了解。那我们不妨回想一下大数据的入门程序 HelloWorld 之 WordCount。当我们运行 WordCount 作业时,划分为拆分、统计、合并三种子任务,其实会对应出 SplitActor、CountActor 以及 MergeActor,其中 SplitActor 接收到消息后主要完成文本的分割,把分割后的数据发送给 CountActor;然后 CountActor 进行统计单词的数目,接着发送消息给 MergeActor;最后 MergeActor 收到消息后,合并每个单词的数目,完成 WordCount 作业。

好了,罗里吧嗦,苦涩的水文一篇,重点是为了下一篇 Akka 实战做铺垫。今天的分享,主要让你对 Actor 模型有一个初步的了解,如果以后再提 Actor 模型,知道在一猿小讲见过,那么这次的分享就算成功。

内容概要:本研究聚焦于“绿电直连型电氢氨园区”的优化运行,提出种直接利用绿色电力驱动制氢与合成氨的综合能源系统架构。通过构建包含风/光发电、电解水制氢、氢气储存、合成氨反应及电能直供等关键环节的系统模型,研究旨在实现能源的高效转化与梯级利用,降低对外部电网依赖,提升园区能源自洽率与经济性。研究综合运用Matlab与Python工具进行建模与仿真,结合实际气象与负荷数据,对系统在不同工况下的运行策略、能量流动、设备容量配置及经济技术指标进行深入分析与优化,并形成完整的Word论文文档,为新型零碳产业园区的规划与建设提供了理论依据和技术支撑。; 适合人群:具备新能源、电力系统、化工或综合能源系统背景的科研人员,以及从事园区规划、能源管理、低碳技术开发的工程技术人员。; 使用场景及目标:①研究绿电如何高效耦合至化工生产流程,实现“电-氢-氨”多能互补;②掌握综合能源系统(IES)的建模、仿真与优化方法,特别是多时间尺度下的运行调度策略;③为撰写高水平学术论文或完成相关课题研究积累数据、代码与写作模板。; 阅读建议:此资源包含代码、数据和完整论文,建议使用者先通读Word论文以理解整体框架与理论基础,再结合Matlab/Python代码进行复现与调试,最后可基于提供的数据和模型进行二次开发,以深化对绿电综合利用技术的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值