2017-11-10 7 views
0

:자식 배우가 부모의 속성을 사용할 수 있습니까?해야합니까? 이 같은 상황에서

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

자식 배우에서 그것을 사용하는 것이 좋습니다 :
(Context.Parent as ParentActor).Data; } }
을하거나 akka 원리에 대해이 있나요?

또는 ChildActor 올바른 방법으로 Data을 전달하고 있습니까?

Data이 변경 가능/변경 불가능인지 여부에 따라 달라질 수 있습니까?

답변

3

그것은 좋은 습관이 아니라, 할 수 없습니다. Context.Parent는 ParentActor로 캐스트 할 수없는 ActorRef를 제공합니다. ActorRef는 액터에게 메시지를 보내는 참조 일 뿐이며, 액터의 클래스와 관계가 없습니다.

어쨌든 akka의 원칙에 따라 액터간에 가변적 인 상태를 공유해서는 안됩니다. 배우의 가변적 인 국가는 결코 배우에게서 누설되어서는 안됩니다. 주 (州)의 일부를 다른 배우에게 보내야하는 경우, 그것이 불변인지 확인하거나 메시지를 보내기 전에 변경 불가능한 사본을 만드십시오. 언급 한대로, 당신은 자식 액터가 자주 그것을 사용하려고한다면 생성자에 대한 데이터를 전달할 수 있습니다. 그러나 불변이어야하며, 그렇지 않으면 다시 불변 사본을 전달해야합니다.

이 배후의 이론적 근거는 주어진 시점에 두 명의 액터가 동시에 실행될 수 있다는 것입니다. 두 액터가 변경 가능한 객체에 대한 액세스를 공유하는 경우, 액터가 동시에 수정할 수 있으므로 액터의 관점에서 경쟁 조건과 비 결정적 동작이 발생합니다. 물론 thread-safe 데이터 구조를 사용할 수도 있지만 akka의 모든 목적을이기는 것입니다. akka는 단일 스레드에서 실행중인 것처럼 메시지 처리를 생각할 수있게 해줍니다.

+0

설명해 주셔서 감사합니다. 좀 더 조사를하고 https://github.com/petabridge/akkadotnet-code-samples/tree/master/PipeTo에서 올바른 방법을 찾아 냈습니다. 사실 병렬 처리를 원했기 때문입니다. 이제는 상태가있는 1 명의 액터가 결과를 자체받은 편지함으로 보내는 PipeTo를 사용하여 모든 메시지를 병렬 (또는 비동기/작업)으로 처리 할 수 ​​있음을 알 수 있습니다. 그것은 좋은 개념입니다! – Gerard

1

저는 직접 akka.net을 처음 사용 합니다만, 액터 모델을 이해하면 메서드 호출이나 생성자 인수를 사용하는 대신 가능하면 항상 메시지를 통해 데이터를 전달해야한다고 제안합니다.