221

Akka 的新手问题 - 我正在阅读 Akka Essentials,有人可以解释 Akka Stop/Poison Pill 与 Kill 之间的区别吗?这本书只提供了一个小解释“杀死是同步的,而毒丸是异步的”。但以什么方式?在此期间调用参与者线程是否锁定?在杀戮、停止后诱发等过程中是否通知了儿童演员?一个概念与另一个概念的示例用法?

非常感谢!

4

4 回答 4

339

两者都stopPoisonPill终止参与者并停止消息队列。它们会导致actor停止处理消息,向它的所有子节点发送停止调用,等待它们终止,然后调用它的postStop钩子。所有进一步的消息都发送到死信邮箱。

不同之处在于在此序列开始之前处理哪些消息。在stop调用的情况下,当前正在处理的消息首先完成,所有其他消息都被丢弃。发送 aPoisonPill时,这只是队列中的另一条消息,因此序列将在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

于 2012-12-12T20:49:21.433 回答
1

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

于 2018-02-16T11:36:57.720 回答
0

PoisonPill 在处理完所有接收到邮箱的消息后,在 PoisonPill 之前异步停止actor。

于 2012-12-12T21:55:10.663 回答
0

您可以同时使用 actor stop 和毒丸来停止对 actor 的处理,并使用 kill 来完全终止 actor。x.stop 是您在 akka 接收方法中进行的调用,只会在调用 postStop 后用新的 actor 替换 actor 状态。X !PoisonPill 是您传递给 actor 以在 actor 运行时停止处理的方法(推荐)。调用 postStop 后也将替换 actor 状态。x.kill 将终止actor,并将删除actor Path 中的actor,并将整个actor 替换为一个新actor。

于 2020-04-30T00:32:21.373 回答