2017-11-10 196 views
0

在這樣的情況:兒童演員可以/應該使用其父母的屬性嗎?

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

在兒童演員是一個很好的做法,使用方法:
(Context.Parent as ParentActor).Data; } }
還是這對阿卡原則?

或者是通過DataChildActor去構造函數的正確方法去嗎?

是否可能取決於Data是否是可變/不可變的?

回答

3

這不僅僅是因爲它不是一個好的做法,它不可能完成。 Context.Parent爲您提供了一個ActorRef,它不能轉換成ParentActor。 ActorRef僅僅是一個發送消息給演員的引用,沒有別的,它和演員的類沒有任何關係。

在任何情況下,阿卡的原則,你永遠不應該分享者之間可變的狀態;你的演員的可變狀態永遠不會泄漏出你的演員。如果您需要將您的狀態的一部分發送給另一個演員,請確保它是不可變的,否則在發送消息之前創建一個不可變的副本。正如您所提到的,如果您的子actor將要經常使用它,您可以在構造函數上傳遞Data,但它必須是不可變的,否則,再傳遞一個不可變的副本。

這樣做的理由是,任何兩個演員可以同時在給定時間點運行。如果兩個參與者共享一個可變對象的訪問權限,他們可能會同時對其進行修改,從而導致競爭條件和非確定性行爲。當然,你可以使用線程安全的數據結構,但這會破壞akka的全部目的,這就是讓你可以像處理單個線程一樣思考消息處理。

+0

感謝您的澄清。我做了一些更多的研究,並找到正確的方法繼續https://github.com/petabridge/akkadotnet-code-samples/tree/master/PipeTo。因爲實際上我想實現並行處理。我現在看到1個具有狀態的actor可以使用PipeTo處理所有的並行消息(或異步/任務),PipeTo會將結果發送到它自己的收件箱。這是一個很好的概念! – Gerard

1

我是新來akka.net自己,但我的角色模型的理解,建議你應該總是嘗試通過郵件來傳遞數據只要有可能,而不是通過方法調用或構造函數的參數。