Akka 子角色是否可以/应该使用其父角色的属性?

Akka 子角色是否可以/应该使用其父角色的属性?,akka,akka.net,Akka,Akka.net,在这种情况下: Data Data; public ParentActor(Data data) { Data = data; Context.ActorOf(Props.Create(() => new ChildActor())) } 在儿童演员中使用: (Context.Parent作为ParentActor).Data;} 还是这违反了阿克卡原则 或者在ChildActor的域中传递数据是正确的方法吗 它是否可能取决于数据是否是可变的?我本人对akka.ne

在这种情况下:

Data Data;
public ParentActor(Data data)
{
     Data  = data;
     Context.ActorOf(Props.Create(() => new ChildActor()))
}
在儿童演员中使用:
(Context.Parent作为ParentActor).Data;}
还是这违反了阿克卡原则

或者在
ChildActor
的域中传递
数据
是正确的方法吗


它是否可能取决于数据是否是可变的?

我本人对akka.net不熟悉,但我对actor模型的理解表明,您应该尽可能通过消息传递数据,而不是通过方法调用或构造函数参数

我本人对akka.net不熟悉,但我对actor模型的理解表明,您应该尽可能通过消息传递数据,而不是通过方法调用或构造函数参数

这不仅仅是因为这不是一个好的做法,而且是不可能做到的。Parent为您提供了一个ActorRef,该ActorRef决不能强制转换为ParentActor。ActorRef只是一个向参与者发送消息的引用,除此之外,它和参与者的类没有关系

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


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

这不仅是一种不好的做法,而且是不可能做到的。Parent为您提供了一个ActorRef,该ActorRef决不能强制转换为ParentActor。ActorRef只是一个向参与者发送消息的引用,除此之外,它和参与者的类没有关系

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


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

感谢您的澄清。我做了更多的研究,找到了正确的方法继续进行研究。因为实际上我想实现并行处理。我现在看到,具有该状态的1个参与者可以使用PipeTo并行(或异步/任务)处理所有消息,并将结果发送到自己的收件箱。这是一个很好的概念!谢谢你的澄清。我做了更多的研究,找到了正确的方法继续进行研究。因为实际上我想实现并行处理。我现在看到,具有该状态的1个参与者可以使用PipeTo并行(或异步/任务)处理所有消息,并将结果发送到自己的收件箱。这是一个很好的概念!