Akka Kill vs. Stop vs. Poison Pill?


212

Akkaの初心者の質問-Akka Essentialsについて読んでいます。AkkaStop / Poison PillとKillの違いを誰かに説明してもらえますか?この本は、「キルは同期的であるのに対し、ポイズンピルは非同期的である」というほんの少しの説明を提供しています。しかし、どのように?この間、呼び出し元のスレッドはロックされますか?殺したり、ポストストップが呼び出されたりしたときに、子供俳優に通知されますか?ある概念と他の概念の使用例?

どうもありがとう!


12
rs_atlは非常によく答えました。アクターについては何も同期せず、context.stop(self)でもありません。
Roland Kuhn

1
@RolandKuhnどうcontext.becomeですか?
Ionuț G. Stan 2014

3
context.become次のメッセージに適用される動作を指定します。つまり、現在のメッセージが処理された後に有効になります。この点でそれはかなり似ていcontext.stop(self)ます。
Roland Kuhn

回答:


328

stopPoisonPillは両方ともアクターを終了し、メッセージキューを停止します。それらは、アクターにメッセージの処理を中止させ、そのすべての子に停止呼び出しを送信し、それらが終了するのを待ってから、その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


4
優秀な回答ありがとうございます。Akkaチュートリアルに投稿してください!
LaloInDublin

16
ActorKilledExceptionは再起動ではなく停止に解決されるため、デフォルト以外のスーパーバイザ戦略を使用しない限り、キルメッセージによってアクターが通常のスーパーバイザメカニズムを使用して再起動することはありません。
lisak 2013年

実際には、アクターを再起動する組み込みの方法は例外をスローすることだけなので、これは非常に煩わしいです。
lisak 2013年

または、PoisonPillを監督するアクターから再起動する必要のあるアクターに送信し、再度開始します。
lisak 2013年

使用しても違いはありますcontext.stop(self)か?
BAR

1

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


0

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


20
いいえ、PoisonPillと同様に、Killには特別な優先順位はありません
Roland Kuhn

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.