2017-11-10 46 views
0

:子役で子アクターは親のプロパティを使用することはできますか?このような状況では

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

は、使用することをお勧めします:
(Context.Parent as ParentActor).Data; } }
またはこれは、アッカの原則に反していますか?

ChildActorに転送していますか?

おそらくDataが変更可能か不変かに依存していますか?

答えて

3

それは良い習慣ではないだけでなく、できません。 Context.Parentは、ParentActorにキャスト可能なActorRefを提供しません。 ActorRefは単にメッセージをアクターに送るための参照に過ぎず、それ以外にはアクターのクラスとの関係はありません。

いずれにしても、akkaの原則では、アクター間で決して可変状態を共有すべきではありません。あなたの俳優の可変状態は、あなたの俳優から漏れてはいけません。状態の一部を別のアクタに送る必要がある場合は、それが不変であることを確認するか、メッセージでメッセージを送信する前に不変のコピーを作成してください。あなたが言及したように、あなたの子アクターが頻繁にそれを使用している場合、コンストラクターにDataを渡すことができますが、不変でなければなりません。そうでなければ、不変のコピーを渡します。

この背景には、任意の時点で2人のアクターが同時に実行できるという根拠があります。 2人のアクターが変更可能なオブジェクトへのアクセスを共有する場合、それらは同時に変更することができ、その結果、競技者の視点からの競合状態および非決定的な動作が生じます。もちろん、スレッドセーフなデータ構造を使うこともできますが、これはakkaの目的を壊してしまいます。これは、メッセージ処理を単一のスレッドで実行しているかのように考えることができます。

+0

ご清聴ありがとうございます。私はさらに調査を行い、https://github.com/petabridge/akkadotnet-code-samples/tree/master/PipeToに進む正しい方法を見つけました。実際には、私は並列処理を実現したかったからです。私は今、州の1人の俳優が、PipeToを使用してすべてのメッセージを並列(または非同期/タスク)で処理し、その結果を自分の受信ボックスに送信できることを確認します。それは素敵なコンセプトです! – Gerard

1

私はakka.netを初めて使っていますが、アクターモデルを理解すると、メソッドコールやコンストラクタ引数ではなく、可能な限りメッセージを介してデータを渡すよう常に試みることが推奨されます。

関連する問題