221

Akkaの初心者向けの質問-AkkaEssentialsについて読んでいますが、Akka Stop / Poison PillとKillの違いを誰かに説明してもらえますか?この本は、「殺害は同期的であるのに対し、毒薬は非同期的である」というほんの少しの説明を提供しています。しかし、どのように?この間、呼び出し元のアクタースレッドはロックされますか?子役は、殺害中、停止後の呼び出し中などに通知されますか?ある概念と他の概念の使用例は?

どうもありがとう!

4

4 に答える 4

339

stopとは両方ともPoisonPillアクターを終了し、メッセージキューを停止します。これにより、アクターはメッセージの処理を停止し、すべての子に停止呼び出しを送信し、子が終了するのを待ってから、postStopフックを呼び出します。それ以降のすべてのメッセージは、デッドレターメールボックスに送信されます。

違いは、このシーケンスが開始する前にメッセージが処理されることです。stop呼び出しの場合、現在処理中のメッセージが最初に完了し、他のすべてのメッセージは破棄されます。を送信する場合PoisonPill、これは単にキュー内の別のメッセージであるため、PoisonPillを受信するとシーケンスが開始されます。キュー内でその前にあるすべてのメッセージが最初に処理されます。

対照的に、このメッセージにより、アクターは通常のスーパーバイザーメカニズムを使用して処理Killされるをスローします。ActorKilledExceptionしたがって、ここでの動作は、スーパーバイザー戦略で定義した内容によって異なります。デフォルトでは、アクターを停止します。ただし、メールボックスは存続するため、アクターが再起動しても、失敗の原因となったメッセージを除いて、古いメッセージが残ります。

ドキュメントの「アクターの停止」、「アクターの殺害」セクションも参照してください。

http://doc.akka.io/docs/akka/snapshot/scala/actors.html

監督戦略の詳細:

http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html

于 2012-12-12T20:49:21.433 に答える
1

できる限りPoisonPillを使用してください。メールボックスに入れられ、他のメッセージと同じように消費されます。アクター内から「context.stop(self)」を使用することもできます。

于 2018-02-16T11:36:57.720 に答える
0

PoisonPillは、メールボックスに受信されたすべてのメッセージが完了した後、PoisonPillの前に、アクターを非同期的に停止します。

于 2012-12-12T21:55:10.663 に答える
0

アクターストップとポイズンピルの両方を使用してアクターの処理を停止し、キルしてアクター全体を終了することができます。x.stopは、akka receiveメソッドで行う呼び出しであり、postStopを呼び出した後にのみ、アクターの状態を新しいアクターに置き換えます。バツ !PoisonPillは、アクターの実行中に処理を停止するためにアクターに渡すメソッドです(推奨)。postStopを呼び出した後のアクターの状態も置き換えます。x.killはアクターを終了し、アクターパス内のアクターを削除し、アクター全体を新しいアクターに置き換えます。

于 2020-04-30T00:32:21.373 に答える