2016-09-20 5 views
2

私はAkkaのシステムでは、ルータ、ディスパッチャ、及び執行について非常に明確ではありませんよ。ルータを定義していない場合、Akka Actorは並行して動作しますか?

私はルータを定義していないので、それをグループの俳優を与えていない場合は、俳優は、並列かで動作しますか?

私はルータを定義しますが、定義としてディスパッチャを使用しない場合:

my-dispatcher { 
    type = Dispatcher 
    executor = "fork-join-executor" 
    fork-join-executor { 
    parallelism-min = 2 
    parallelism-factor = 2.0 
    parallelism-max = 10 
    } 
    throughput = 100 
} 

俳優が並列に実行されるかどうか?

答えて

3

私はルータを定義していないため、グループに のアクターを与えないと、アクターは並列に実行されるかどうかを確認します。

アクターシステムのDispatcherは、アクターを実行するスレッドの基本プールを持つExecutionContextのラッパーです。あなたが作成するすべての単一俳優で、それにメッセージを渡す場合は、すべてのメッセージは、彼を1つずつ処理する同じ俳優のメールボックスに到着します。俳優の内部の実行が同期を発生します。

あなたは複数のアクターがリクエストを処理したい場合は、そのルータがあるため、正確に何です。あなたが要求を同じに扱うことができる俳優たちのグループを持っているしたい場合は、ルータを割り当て、それは俳優が作品のどの量を取得した場合の世話をして、あなたのための俳優たちのグループを管理します。

context.actorOf(
    Props(new MyActor()) 
    .withRouter(RoundRobinPool(nrOfInstances = 10)), name = "MyRouter") 

これはRouterとが作成されます:あなたは、ルータを持っていて、単純にラウンドロビン方式で俳優のメールボックスにメッセージを割り当てRoundRobinPool、すなわち、俳優の内部プールを定義するとき

一例は、 10人の俳優を含むRoundRobinPool

+0

感謝し、それを処理し、私はより多くを知っている必要がありますように、俳優たちのグループに俳優やルートのグループメッセージを作成します。ルータを作成し、プールサイズが10のRoundRobinPoolと言って、 'parallelism-max'を8に設定すると、10人または8人のアクターインスタンスが並行して実行されますか? –

+0

@Stephen 8スレッドのスレッドプールを共有する10人のアクターを取得します。 –

+0

これは、最大8つのインスタンスが並行して実行されていることを意味します。 –

2

メッセージは、メッセージがアクターに送信され

「1人の俳優は何の俳優ではない」と言われ、なぜ俳優

thatsの内部でシリアルに実行されます。それは俳優の郵便箱の中に着きます。メールボックス内のメッセージは、順次処理されます。ここで注目すべき重要なことは、アクターは、各メッセージの振る舞いが1つのスレッドで実行されることを確実にすることです。

だから、ルータ各アクターが同時かつ並列にあなたの答えのための

+0

ありがとうございます。私は "俳優は、各メッセージの振る舞いが1つのスレッドで実行されることを保証する"ということを何度も行っていますが、なぜ "それは別のスレッドである"という考えが解決されなければならないのか理解できません。アプリケーションに影響を与えますか? –

+0

@Stephen ...俳優は計算のためのコンテナです...このコンテナは自由に...計算するアイドルスレッドを選択できます。 Idea is Actorは、システム内で利用可能な任意のスレッドを処理できる安価なオブジェクトに役立ちます。これは非常に重要です。なぜなら、多くのアクターは、仕事をするために限られた数のスレッドを使うことができるからです – pamu

関連する問題