Akka Kill vs. Stop vs. Poison Pill?


212

关于Akka的新手问题-我正在阅读Akka Essentials,有人可以解释一下Akka Stop / Poison Pill与Kill的区别吗?本书仅作了一个小小的解释:“杀人是同步的,而毒药是异步的”。但是用什么方式呢?调用方线程在此期间是否锁定?是否在杀戮,制止后唤起等等期间通知儿童演员?一个概念与另一个概念的示例用法?

非常感谢!


12
rs_atl回答得很好,让我补充一点,关于参与者的任何信息都是同步的,甚至不是context.stop(self)。
罗兰·库恩

1
@RolandKuhn怎么样context.become
Ionuț G. Stan 2014年

3
context.become指定要应用于下一条消息的行为,这意味着该行为在处理了当前消息之后才会生效;在这方面很像context.stop(self)
罗兰·库恩

Answers:


328

双方stopPoisonPill会终止演员和停止消息队列。它们将导致Actor停止处理消息,向其所有子级发送停止调用,等待它们终止,然后调用其postStop挂钩。所有其他消息将发送到无效字母邮箱。

区别在于在此序列开始之前处理消息的方式。在stop呼叫的情况下,当前正在处理的消息将首先完成,而所有其他消息都将被丢弃。发送时PoisonPill,这只是队列中的另一条消息,因此序列将在PoisonPill收到时开始。队列中所有在其前面的消息将被首先处理。

相比之下,该Kill消息使参与者抛出一个ActorKilledException使用常规管理程序机制处理的消息。因此,这里的行为取决于您在主管策略中定义的内容。默认为停止actor。但是邮箱仍然存在,因此当actor重新启动时,它仍然会包含旧邮件,但导致失败的邮件除外。

另请参阅文档中的“停止演员”,“杀死演员”部分:

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

还有更多有关监管策略的信息:

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


4
极好的回答谢谢,应该在Akka教程上发布!
LaloInDublin 2012年

16
除非您使用非默认管理程序策略,否则Kill消息不会导致Actor使用常规管理程序机制重新启动,因为ActorKilledException解析为Stop,而不是Restart。
lisak 2013年

实际上,这很烦人,因为重新启动actor的唯一内置方法是引发Exception。
lisak 2013年

或者,将监督者的PoisonPill发送给应该重新启动的PoisonPill,然后重新启动它。
lisak 2013年

如果使用有什么区别context.stop(self)吗?
2015年

1

尽可能使用PoisonPill。它被放在邮箱中,并且像其他任何消息一样被消耗。您也可以在演员中使用“ context.stop(self)”。


0

在PoisonPill之前,PoisonPill对接收到邮箱中的所有消息完成操作后,异步停止角色。


20
不,杀死没有特别的优先权,就像PoisonPill
Roland Kuhn

0

您可以同时使用actor stop和actor pill来停止对actor的处理,并杀死可以完全终止actor。x.stop是您在akka接收方法中进行的调用,仅在调用postStop之后用新角色替换角色状态。X !PoisonPill是一种在actor运行时传递给actor以停止处理的方法(推荐)。在调用postStop之后也将替换actor状态。x.kill将终止演员,并将演员路径中的演员删除,并将整个演员替换为新的演员。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.