什么时候可以安全地阻止Akka 2演员?

时间:2013-01-24 15:54:20

标签: akka

我知道不建议在演员的receive方法中阻止,但我相信它可以完成(只要不是太多演员一次完成)。

This post建议在preStart中阻止作为解决问题的一种方法,因此可能在preStart中阻止是安全的。

但是,我试图阻止preRestart(不是preStart)并且一切似乎只是挂起 - 没有收到更多消息。

此外,如果不能安全阻止,什么是安全的替代方案?

2 个答案:

答案 0 :(得分:1)

receive时阻止相对安全:

  1. 总计被阻止的actor的数量远小于总工作线程的数量。默认情况下,有十个工作线程,因此1-2个被阻止的演员很好

  2. 阻止actor有自己的专用调度程序(线程池)。其他演员不受影响

  3. 当阻止不安全时,好的选择是...不阻止;-)。如果您正在使用本质上阻塞的遗留API,您可以在某个actor内部维护一个单独的线程池(感觉不对)或使用上面的方法2.将少数线程专用于需要阻止的actor子集。

答案 1 :(得分:1)

永远不要阻止演员。

如果你的actor是actor层次结构的一部分(它应该是),则actor系统无法阻止它。 演员的生命周期(监督,监督等)是通过消息传递完成的。 停止阻止孩子的父演员是行不通的。

也许有办法将阻止条件与演员的生命周期结合起来。 但这会导致并发症和不良风格的过载。

所以,最好的方法是在该actor之外做阻塞部分。 例如。您可以通过执行程序服务在单独的线程中运行阻止代码。