Akka Actor的紧急停止
Emergency stopping of Akka Actor
我正在使用 Akka 框架来控制硬件,在极少数情况下,我需要在计算过程中冻结 actor。这样可以防止损坏硬件。有没有办法快速冻结或杀死 Actor,即使它仍然是 运行 任务?
遗憾的是,这不是 JVM 支持的。虽然一个线程是 运行,例如做一些长的 运行 操作,它不能被任意中断(是的,有一个 interrupt()
调用但是它只是设置一个标志,并且线程的用户态代码可能会查看此标志,这不是强制中断)。由于 Akka Actors 使用 Java 个线程,因此同样的限制也适用于它们。
然而,Actor 在这里提供帮助的方式是您可以将工作分成非常小的工作块,想想 "steps",并将它们表示为消息。如果您检测到您不应该继续进行,您可以简单地隐藏消息(或者简单地不对它们进行操作,而不是执行某些操作)。
这在某种程度上取决于您所说的 "freeze" 是什么意思。这本身是不可能的,但也许可以实现非常相似的效果?
// 杀死部分可以通过 Actor 内部的 context stop self
或发送一个 PoisonPill
来完成,然而这是异步的并且通过 Actors 邮箱 - 就像 Actor 通信中的一切一样。
我正在使用 Akka 框架来控制硬件,在极少数情况下,我需要在计算过程中冻结 actor。这样可以防止损坏硬件。有没有办法快速冻结或杀死 Actor,即使它仍然是 运行 任务?
遗憾的是,这不是 JVM 支持的。虽然一个线程是 运行,例如做一些长的 运行 操作,它不能被任意中断(是的,有一个 interrupt()
调用但是它只是设置一个标志,并且线程的用户态代码可能会查看此标志,这不是强制中断)。由于 Akka Actors 使用 Java 个线程,因此同样的限制也适用于它们。
然而,Actor 在这里提供帮助的方式是您可以将工作分成非常小的工作块,想想 "steps",并将它们表示为消息。如果您检测到您不应该继续进行,您可以简单地隐藏消息(或者简单地不对它们进行操作,而不是执行某些操作)。
这在某种程度上取决于您所说的 "freeze" 是什么意思。这本身是不可能的,但也许可以实现非常相似的效果?
// 杀死部分可以通过 Actor 内部的 context stop self
或发送一个 PoisonPill
来完成,然而这是异步的并且通过 Actors 邮箱 - 就像 Actor 通信中的一切一样。