关于Akka的新手问题 - 我正在阅读《Akka Essentials》,请问有人能解释一下Akka Stop/Poison Pill和Kill之间的区别吗?书中只是简单地解释了一下“Kill是同步的,而Poison pill是异步的。”但是在哪些方面呢? 在此期间,调用actor线程是否会锁定?在Kill、post-stop被调用时,子actor是否会收到通知?一个概念与另一个概念的示例用法有什么不同?
非常感谢!
stop
和 PoisonPill
都会终止actor并停止消息队列。它们将导致actor停止处理消息,向所有子节点发送停止调用,等待它们终止,然后调用其postStop
hook。所有进一步的消息都将被发送到死信邮箱。
区别在于在此序列开始之前处理哪些消息。在调用stop
时,当前正在处理的消息首先完成,所有其他消息都将被丢弃。当发送PoisonPill
时,这只是队列中的另一个消息,因此当接收到PoisonPill
时序列将开始。队列中排在其前面的所有消息都将首先得到处理。
相比之下,Kill
消息会导致actor抛出一个ActorKilledException
,使用正常的supervisor机制进行处理。因此,这里的行为取决于您在监管策略中定义的内容。默认值是停止actor。但是邮箱仍然存在,因此当actor重新启动时,它仍将具有旧消息,除了导致失败的那个消息。
还可以查看文档中的“停止actor”、“杀死actor”部分:
http://doc.akka.io/docs/akka/snapshot/scala/actors.html
以及有关监管策略的更多信息:
http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html
尽可能使用PoisonPill。它被放置在邮箱中并像任何其他信件一样被消耗。您也可以在actor内部使用"context.stop(self)"。
PoisonPill 是一种异步方式,它会在处理完邮箱中 PoisonPill 之前的所有消息后停止 Actor。
您可以使用actor stop和poison pill来停止actor的处理,使用kill来完全终止actor。 x.stop是在akka receive方法中调用的,只会在调用postStop后将actor状态替换为新的actor。 x!PoisonPill是一种方法,您可以将其传递给正在运行的actor以停止处理(推荐使用)。在调用postStop后也会替换actor状态。 x.kill将终止actor并将actor从actor路径中删除,并用新的actor替换整个actor。
context.become
怎么样? - Ionuț G. Stancontext.become
指定了将应用于下一条消息的行为,这意味着它会在当前消息被处理完毕之后生效;在这方面它类似于context.stop(self)
。 - Roland Kuhn