演员模型:一个演员需要另一个演员的信息

用户965972

关于演员模型,我不明白的是这一点。假设你有两个演员。他们从各种来源收集和管理数据。这些来源通过他们的收件箱/邮箱/队列与演员互动。例如,参与者 A 收集信号,而参与者 B 管理有关整个系统的信息。

在某些时候,Actor A 必须处理它的数据。虽然它正在处理,但它不能做其他事情。例如,无法处理新信号。作为数据处理的一部分,参与者 A 需要参与者 B 的信息才能继续。

在伪代码中:

functionOfActorA()
{
  internalQueue {
   ...doing stuff with our data
   info = actor_B.getInfo() -> what should happen here?
   ...doing stuf with our data and the obtained info
   }
}

getInfo()//function of actor B
{
  internalQueue {
    ...prepare requested info
    ... -> what should happen here?
  }
} 

如果两个参与者都应该在自己的队列或线程上独立运行,那么如何根据参与者的请求从一个参与者获取信息到另一个参与者?

奎师那。

参与者 A 可以通过向参与者 B 发送请求来请求信息,但响应将以消息形式返回,参与者 A 将在未来某个时刻收到该消息。有两种方法可以保存这些信息:

  1. Actor A 可以在内部存储信息以等待该响应。

  2. Actor A 可以将信息附加到它发送给 Actor B 的消息中,并且 Actor B 返回该上下文(否则它会忽略)。

当Actor A从Actor B那里得到信息后,它就可以继续处理了。

这是第一种实现风格的示例,使用 Thespian Python 演员库 ( http://thespianpy.com ):

class ActorA(Actor):

    def __init__(self, *args, **kw):
        super(ActorA, self).__init__(args, kw)
        self.datalist = []

    def receiveMessage(self, msg, sender):

        if isinstance(msg, ActorAddress):
            self.actorB = msg

        elif isinstance(msg, WorkRequest):
            x = got_some_data(msg)
            self.datalist.append(x)
            self.send(self.actorB, NeedInfo())

        elif isinstance(msg, Info):
            x = self.datalist.pop()
            process_data(x, msg)

class ActorB(Actor):

    def receiveMessage(self, msg, sender):

        if isinstance(msg, NeedInfo):
            i = get_info(msg)
            self.send(sender, i)

上面显示了将工作内部存储到actor的基本功能,稍后继续。有几个考虑:

  • 如果要存储多个数据项,ActorA 需要有某种方法来确定来自 ActorB 的信息适用于哪个项目。

  • ActorA 需要处理它还不知道 ActorB 的地址的情况。

  • ActorA 可能应该使用某种超时来避免将工作永远保留在其内部列表中(如果 ActorB 以某种方式从不响应)。

  • 如果 ActorA 退出或死亡,它应该在退出之前对仍在数据列表中的项目做一些适当的处理。

下面是第二种实现风格的对应简单示例:

class ActorA(Actor):

    def receiveMessage(self, msg, sender):

        if isinstance(msg, ActorAddress):
            self.actorB = msg

        elif isinstance(msg, WorkRequest):
            x = got_some_data(msg)
            self.send(self.actorB, NeedInfo(x))

        elif isinstance(msg, Info):
            x = msg.orig_request.data
            process_data(x, msg)

class ActorB(Actor):

    def receiveMessage(self, msg, sender):

        if isinstance(msg, NeedInfo):
            i = getinfo(msg)
            i.orig_request = msg
            self.send(sender, i)

在第二个示例中,创建 NeedInfo 的调用将数据存储在.dataNeedInfo 对象字段中,ActorB 传回的 Info 附加了原始的 NeedInfo 消息。这种风格的注意事项是:

  • 无需将原始 WorkRequest 消息与相应的 Info 独立关联,因为它们是相互关联的。

  • ActorA 更依赖于 ActorB 的实现,以期望 ActorB 将原始消息附加到其响应中,以允许 ActorA 恢复此上下文。

  • ActorA 仍然需要处理它还不知道 ActorB 的地址的情况。

  • 如果 ActorA 退出或死亡,则它没有此未完成工作的记录以在清理之前采取任何行动(尽管 Dead Letter 处理程序可以执行此角色)。

上面的示例相当简单,其他 Actor 模型库实现会有一些变化,但无论库/语言如何,这些通用技术都应该广泛应用。这两种实现风格都遵循以下通用 Actor 指南:

  1. 收到消息后,做可能的工作

  2. 根据需要更新内部状态以处理下一条消息

  3. 退出消息处理程序

虽然可以编写执行阻塞操作的 Actor,但该操作会干扰 Actor 的响应能力和处理其他消息的能力(正如您正确指出的),因此尽可能使用消息驱动的延续而不是阻塞调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在另一个演员中创建Akka演员

演员响应另一个InputListerner

Cadence 是一个演员框架吗?

我应该如何等待akka.net中另一个演员的消息回复?

演员符合表放置在一个表(LIBGDX)

如何构造一个演员及其包装器?

Akka演员-询问消息给我一个空集

如何终止一个悬空的akka演员?

在Scene2d中掠过一个演员

一个集群可以有多个单例演员吗?

如何使用Scene2d和LibGDX将演员集中在一个小组中?

如何在一个舞台上的不同位置绘制同一演员的多份副本?

C++ 被迫做一个奇怪的演员来摆脱“表达式应该是一个可修改的左值”

如何在另一个模型中显示模型信息?在Django

需要将信息从一个函数的结果分配到另一个函数的开头

GAE需要模型属性,如果另一个具有一定的价值?

一个领域的数据模型的更改需要迁移另一个领域。为什么?

使用另一个模型添加模型约束

如何生成扩展另一个模型的模型

Django 从另一个模型获取模型

在另一个模型中访问 listView 模型

访问属于另一个模型的模型

需要基于另一个表中的另一个列填充一个列

DDD:聚合根需要来自另一个聚合根的信息

Django - 在保存另一个模型时保存一个模型

Rails:如何使一个模型“属于”另一个模型?

模型的每个实例都有另一个模型的一个或多个实例

在node.js中从另一个模型引用一个模型

在ViewModel中将值从一个模型传递到另一个模型