原文链接:http://blog.jeoygin.org/archives/477

Actor这个模型由Carl Hewitt在1973年提出,Gul Agha在1986年发表技术报告“Actors: A Model of Concurrent Computation in Distributed Systems”,至今已有不少年头了。在计算机科学中,它是一个并行计算的数学模型,最初为由大量独立的微处理器组成的高并行计算机所开发,Actor模型的理念非常简单:天下万物皆为Actor。

  Actor之间通过发送消息来通信,消息的传送是异步的,通过一个邮件队列(mail queue)来处理消息。每个Actor是完全独立的,可以同时执行它们的操作。每一个Actor是一个计算实体,映射接收到的消息到以下动作:

  • 发送有限个消息给其它Actor;
  • 创建有限个新的Actor;
  • 为下一个接收的消息指定行为。

  以上三种动作并没有固定的顺序,可以并发地执行。Actor会根据接收到的消息进行不同的处理。

  在一个Actor系统中,包含一个未处理的任务集,每一个任务由以下三个属性标识:

  • tag:用以区别于系统中的其它任务;
  • target:通信到达的地址;
  • communication:包含在target上的Actor处理任务时可获取的信息,。

  简单起见,可以把一个任务视为一个消息,在Actor之间传递包含以上三个属性的值的消息。

  Actor模型有两种任务调度方式:基于线程的调度以及基于事件的调度:

  • 基于线程的调度:为每个Actor分配一个线程,在接收一个消息时,如果当前Actor的邮箱(mail box)为空,则会阻塞当前线程。基于线程的调度实现较为简单,但线程数量受到操作的限制,现在的Actor模型一般不采用这种方式;
  • 基于事件的调试:事件可以理解为上述任务或消息的到来,而此时才会为Actor的任务分配线程并执行。

  综上,我们知道可以把系统中的所有事物都抽象成一个Actor:

  • Actor的输入是接收到的消息。
  • Actor接收到消息后处理消息中定义的任务。
  • Actor处理完成任务后可以发送消息给其它的Actor。

  那么在一个系统中,可以将一个大规模的任务分解为一些小任务,这些小任务可以由多个Actor并发处理,从而减少任务的完成时间。

  举个简单的例子,比如现在要在3台物理节点上运行一个WordCount作业,可以将这个作业细分为Split、Count和Merge三种任务(任务的target是物理节点的地址,communication可能包含文本、单词及计数等),根据需求要有Split Actor、Count Actor和Merge Actor。整个作业的处理流程以下:

  • Split Actor接收到消息后可以文本分割成10份,每份发送给一个Count Actor;
  • Count Actor统计好单词的数目后发送消息给Merge Actor;
  • Merge Actor收集完Count Actor发送的10个消息后,合并每个单词的数目,完成WordCount任务。

  从以上例子可以看出,Actor系统跟数据驱动系统比如数据流相近,可以自定义任务的流向及其处理过程。Actor模型被广泛使用在很多并发系统中,比如Email、Web Service等等。

参考资料

  (1) G. Agha, Actors: A Model of Concurrent Computation in Distributed Systems. Cambridge, MA, SA: MIT Press,1986.

  (2) Wikipedia: http://en.wikipedia.org/wiki/Actor_model

  (3) ActorLite:一个轻量级Actor模型实现(上)

Actor模型[转]的更多相关文章

  1. .NET的Actor模型:Orleans

    Orleans是微软推出的类似Scala Akka的Actor模型,Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务, 可用于实现DDD+EventSou ...

  2. 以Akka为示例,介绍Actor模型

    许多开发者在创建和维护多线程应用程序时经历过各种各样的问题,他们希望能在一个更高层次的抽象上进行工作,以避免直接和线程与锁打交道.为了帮助这些开发者,Arun Manivannan编写了一系列的博客帖 ...

  3. 根据老赵轻量级Actor进行修改的Actor模型

    学习了老赵轻量级Actor模型,并在实际中使用,效果不错. 老赵轻量级Actor模型: ActorLite:一个轻量级Actor模型实现(上) ActorLite:一个轻量级Actor模型实现(中) ...

  4. Orleans:NET的Actor模型

    .NET的Actor模型:Orleans   Orleans是微软推出的类似Scala Akka的Actor模型,Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展 ...

  5. Actor模型原理

    1.Actor模型 在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用 ...

  6. 终结python协程----从yield到actor模型的实现

    把应用程序的代码分为多个代码块,正常情况代码自上而下顺序执行.如果代码块A运行过程中,能够切换执行代码块B,又能够从代码块B再切换回去继续执行代码块A,这就实现了协程 我们知道线程的调度(线程上下文切 ...

  7. Actor模型-Akka

    英文原文链接,译文链接,原文作者:Arun Manivannan ,译者:有孚 写过多线程的人都不会否认,多线程应用的维护是件多么困难和痛苦的事.我说的是维护,这是因为开始的时候还很简单,一旦你看到性 ...

  8. Actor模型及原理

    1.Actor模型 在使用Java进行并发编程时需要特别的关注锁和内存原子性等一系列线程问题,而Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用 ...

  9. [面试]Actor模型

    Actor模型 面试中自己说话不利落, 或者自己对知识点认识不全面.在这里进行一下记录. 理论部分都是收集(copy)自网上其他的博客. 什么是Actor模型 参与者模式(英语:Actor model ...

随机推荐

  1. UAC权限

    .NET中提升UAC权限的方法总结   [题外话] 从Vista开始,由于增加了UAC(用户账户控制,User Account Control)功能,使得管理员用户平时不再拥有能控制所有功能的管理员权 ...

  2. 适合编写代码的字体 Source Code Pro

    今天看到博客园一篇文章,介绍了一种出身自 Adobe 的适合编码的字体,等宽,支持ClearType等,试用一下吧 项目地址:https://github.com/adobe/source-code- ...

  3. 运用Unity结合PolicyInjection实现拦截器

    运用Unity结合PolicyInjection实现拦截器[结合操作日志实例] 上一篇文章我们通过Unity自身Unity.InterceptionExtension.IInterceptionBeh ...

  4. Linux系统小问题解决总结

    [解决Ubuntu missing launcher and menu bar的问题] 按下ctrl + Alt + T打开终端: 输入以下命令: dconf reset -f /org/compiz ...

  5. Android开发中与服务器交互时,遇到java.io.IOException: Target host must not be null的问题

    当我遇到这个问题的时候,也在网上查找好半天.找到了一个和这个问题很类似的问题——java.lang.IllegalStateException: Target host must not be nul ...

  6. c# AutoResetEvent和ManualResetEvent

    网上有很多AutoResetEvent和ManualResetEvent的详细介绍,在这里不做过多详细的解释,写下自己的一点心得留作备忘. AutoResetEvent和ManualResetEven ...

  7. hdu 1253 胜利大逃亡(BFS)

    题目链接:点击链接 三维的BFS,刚开始一直超内存,超无语......  改了n多次终于AC了 #include <iostream> #include <stdio.h> # ...

  8. hdu 1998 奇数阶魔方(找规律+模拟)

    应该不算太水吧. 17  24   1   8  15   23   5   7  14  16    4   6  13  20  22   10  12  19  21   3   11  18 ...

  9. 深刻理解HDFS工作机制

    深入理解一个技术的工作机制是灵活运用和快速解决问题的根本方法,也是唯一途径.对于HDFS来说除了要明白它的应用场景和用法以及通用分布式架构之外更重要的是理解关键步骤的原理和实现细节.在看这篇博文之前需 ...

  10. kubernetes入门之skydns

    部署kubernetes dns服务 kubernetes可以为pod提供dns内部域名解析服务.其主要作用是为pod提供可以直接通过service的名字解析为对应service的ip的功能. 部署k ...