Can/should 一个 child 演员使用其 parent 的 属性?
Can/should a child actor use a property of its parent?
在这样的情况下:
Data Data;
public ParentActor(Data data)
{
Data = data;
Context.ActorOf(Props.Create(() => new ChildActor()))
}
在 child actor 中使用:
是个好习惯吗
(Context.Parent as ParentActor).Data; } }
还是这违反了 akka 原则?
或者在 ChildActor
的指示器中传递 Data
是正确的方法吗?
是否可能取决于 Data
是否为 mutable/immutable?
我自己是 akka.net 的新手,但我对 actor 模型的理解表明,您应该始终尽可能尝试通过消息传递数据,而不是通过方法调用或构造函数参数。
这不仅不是一个好的做法,而且不能完成。 Context.Parent 为您提供了一个 ActorRef,它无法转换为 ParentActor。 ActorRef 只是一个向 actor 发送消息的引用,没有别的,它与 actor 的 class 没有任何关系。
无论如何,根据 akka 的原则,你不应该在 actor 之间共享可变状态;你的演员的可变状态不应该从你的演员中泄露出来。如果您需要将状态的一部分发送给另一个参与者,请确保它是不可变的,或者在通过消息发送之前制作一个不可变的副本。正如您提到的,如果您的子 actor 将经常使用它,您可以在构造函数上传递数据,但它必须是不可变的,否则,再次传递一个不可变副本。
这背后的基本原理是任何两个演员都可以在给定的时间点同时 运行。如果两个参与者共享对一个可变对象的访问,他们可能会同时修改它,从任何一个参与者的角度来看都会导致竞争条件和非确定性行为。当然,您可以使用线程安全的数据结构,但这会破坏 akka 的全部目的,即允许您将消息处理视为 运行 在单个线程上。
在这样的情况下:
Data Data;
public ParentActor(Data data)
{
Data = data;
Context.ActorOf(Props.Create(() => new ChildActor()))
}
在 child actor 中使用:
是个好习惯吗
(Context.Parent as ParentActor).Data; } }
还是这违反了 akka 原则?
或者在 ChildActor
的指示器中传递 Data
是正确的方法吗?
是否可能取决于 Data
是否为 mutable/immutable?
我自己是 akka.net 的新手,但我对 actor 模型的理解表明,您应该始终尽可能尝试通过消息传递数据,而不是通过方法调用或构造函数参数。
这不仅不是一个好的做法,而且不能完成。 Context.Parent 为您提供了一个 ActorRef,它无法转换为 ParentActor。 ActorRef 只是一个向 actor 发送消息的引用,没有别的,它与 actor 的 class 没有任何关系。
无论如何,根据 akka 的原则,你不应该在 actor 之间共享可变状态;你的演员的可变状态不应该从你的演员中泄露出来。如果您需要将状态的一部分发送给另一个参与者,请确保它是不可变的,或者在通过消息发送之前制作一个不可变的副本。正如您提到的,如果您的子 actor 将经常使用它,您可以在构造函数上传递数据,但它必须是不可变的,否则,再次传递一个不可变副本。
这背后的基本原理是任何两个演员都可以在给定的时间点同时 运行。如果两个参与者共享对一个可变对象的访问,他们可能会同时修改它,从任何一个参与者的角度来看都会导致竞争条件和非确定性行为。当然,您可以使用线程安全的数据结构,但这会破坏 akka 的全部目的,即允许您将消息处理视为 运行 在单个线程上。