参与者模式是一种并行运算上的模型。「参与者」是一种程序上的抽象概念。被看作并行运算的基本单元。当一个参与者接收到一个消息,可以做出一些决策,建立更多的参与者,传送更多的消息,同时准备接受下一条消息。

介绍

每个线程都是一个Actor,不共享任何内存,所有的数据都通过消息传递的方式进行。通过一个邮件队列(mail queue)来处理消息。

每个Actor是一个计算实体,映射接受到的消息到以下动作:

  • 发送消息给其他Actor;
  • 创建新的Actor;
  • 为下一个接受的消息制定行为;

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

  • tag:区分系统中的其他任务;
  • target:通信到达的地址;
  • communication:在 target 上的Actor处理任务时可获取的信息;

Actor模型有两种任务调度方式:

  1. 基于线程的调度:每个Actor分配一个线程,在接受一个消息时,如果当前Actor的邮箱为空,则会阻塞当前线程。
  2. 基于事件的调度:事件可以理解为上述任务或消息的到来,而此时才会为Actor的任务分配线程并执行。

实现消息传递也有两种类型:

  1. 基于channel的消息传递:消息会被发送到由进程(process)共享的通道(channels)里,其他进程可以从这个通道里读取消息。基于channel的系统实例有MPI(Message-Passing Interface),以及CSP(Communicating Sequential Processes)。
  2. 基于Actor的消息传递:消息会被直接发送到Actors,不需要建立中间通道来在不同进程间传递消息。

CSP(Communicating sequential processes)

在计算机科学领域,Communicating Sequential Processes (CSP1)是一种用于描述并发系统交互模型的形式语言,最早起源于Tony Hoare(图灵奖获得者、著名的排序算法快排的作者)在1978年发表的论文2

和上面的Actor模型不同,CSP采用固定数量的sequential processes并连接到固定的拓扑结构上,并采用同步消息传递机制。

CSP用两个基本类型来描述并发系统。事件和进程(Primitive processes)。

  • 事件:表示通信或交互行为。具有不可分割性和瞬时性。
  • 进程:用来表示基本行为。

优缺点

优点

适用于解决多种并发问题。

缺点

虽然比线程和锁模型更容易debug,但也会碰到actor模型独有的问题(邮箱溢出),由于actor模型不共享状态,仅通过消息传递来进行交流,所以不太适合细粒度的并行。

  1. http://en.wikipedia.org/wiki/Communicating

  2. Hoare, C. A. R. (1978). “Communicating sequential processes”. Communications of the ACM 21 (8): 666–677. doi:10.1145/359576.359585.http://dx.doi.org/10.1145%2F359576.359585

参考资料:

Event-Based Programming without Inversion of Control