代码之家  ›  专栏  ›  技术社区  ›  Gerard

子参与者可以/应该使用其父参与者的属性吗?

  •  0
  • Gerard  · 技术社区  · 7 年前

    在这种情况下:

    Data Data;
    public ParentActor(Data data)
    {
         Data  = data;
         Context.ActorOf(Props.Create(() => new ChildActor()))
    }
    


    (Context.Parent as ParentActor).Data; } }
    还是这违背了阿克卡原则?

    或正在通过 Data 在…中 ChildActor 正确的方法是什么?

    这可能取决于 数据 是否可变?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Pedro    7 年前

    这不仅仅是因为这不是一个好的做法,这是不可能做到的。上下文Parent给你一个ActorRef,它决不是ParentActor可以铸造的。ActorRef只是一个向参与者发送消息的引用,其他什么都没有,它和参与者的类没有关系。

    无论如何,根据阿克卡的原则,你永远不应该在参与者之间共享可变状态;演员的可变状态永远不应该泄露给演员。如果您需要将状态的一部分发送给另一个参与者,请确保它是不可变的,或者在将其发送到消息之前制作一个不可变的副本。正如您所提到的,如果您的子参与者将经常使用数据,您可以在构造函数上传递数据,但它必须是不可变的,否则,再次传递一个不可变的副本。

    这背后的基本原理是,任何两个参与者都可以在给定的时间点同时运行。如果两个参与者共享对可变对象的访问权限,他们可能会同时修改它,从任何一个参与者的角度来看,都会导致竞争条件和不确定性行为。当然,您可以使用线程安全的数据结构,但这将破坏akka的全部目的,即允许您将消息处理视为在单个线程上运行。

        2
  •  1
  •   sphide    7 年前

    我刚到阿克卡。net,但我对actor模型的理解表明,应该尽可能通过消息传递数据,而不是通过方法调用或构造函数参数。