48

我正在做一些 Objective-C / iOS 开发,并且听说过一些对 Actor 模式的引用。在大书呆子牧场的书中,它说:

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

这里的actor与网络调用结合使用。这就是 Actor 的主要使用方式吗?它是相互排斥的还是与代表团互补的?Actor 的定义似乎非常广泛,我正试图更好地理解它的含义。此外,是否可以在非 OO 环境中拥有 Actor?

4

1 回答 1

62

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

  • 发送和接收消息(每个actor都有一个邮箱)
  • 不与其他参与者共享可变内存
  • 根据运行时的突发奇想进行调度。一个actor可以被赋予它自己的线程,但更有可能的是多个actor在一个线程中参与协作多线程,或者甚至可能参与抢占式多线程。

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

每当您需要大量(和大量)有状态的小进程时,都可以使用 Actor。网络是一个常见的用例,因为您不想为每个连接分配整个线程。你想要更轻量级的东西,所以你为每个连接分配一个actor,然后将actor调度到一个较小的线程池中。但网络肯定不是演员的唯一用途。

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

于 2012-07-26T18:38:10.253 回答