演员模式 - 它究竟构成了什么

时间:2012-07-26 18:11:23

标签: design-patterns actor

我正在做一些客观的C / iOS开发,并听过几个对Actor模式的引用。在Big Nerd Ranch的书中,它说:

  

当您有一个长时间运行的任务时,会使用一个actor对象   完成后需要执行的代码。这种对象   获得执行任务和回调所需的信息   在该任务完成时执行。 actor在自己的线程上运行   没有任何进一步的输入,并在完成时被销毁。

此处的演员与网络电话一起使用。这是演员主要使用的方式吗?是否与代表团相互排斥或互补? Actor的定义似乎非常广泛,我试图更好地处理它的含义。此外,是否可以在非OO环境中拥有一个Actor?

1 个答案:

答案 0 :(得分:60)

对Actor的定义实际上似乎有点限制。它肯定不会处理Erlang风格的演员(或者我相信Scala风格的演员)。根据我的经验,演员是:

  • 发送和接收消息(每个演员都有一个邮箱)
  • 与其他演员分享不可变的记忆
  • 根据运行时的异想天开进行安排。一个actor可以被赋予自己的线程,但是更有可能的是,几个参与者在一个线程中参与合作多线程,或者甚至参与先发制人的多线程。

但从根本上说,一个actor是一个自由运行的代码块,可以从其环境接收消息,并可以将消息发送回其环境。

只要您需要大量(和大量)有状态的小进程,就会使用Actor。网络是一种常见的用例,因为您不希望为每个连接分配整个线程。你想要一些更轻量级的东西,所以你为每个连接分配一个actor,然后在一个较小的线程池上安排actor。但网络肯定不是演员的唯一用途。

在Erlang中,演员是一个功能。该函数可能尾部调用自身(因此它基本上是一个无限循环),并且它可能有一种干净的自终止方式(无限循环具有“中断”条件)。循环通常等待来自系统的消息,处理它,然后将消息发送到系统的其余部分。 Erlang OTP库有一些抽象,甚至不需要编写循环,所以OTP actor被实现为一组回调。通过这种方式,OTP演员看起来很像一个对象。