0

我知道不建议在receive一个actor的方法中阻塞,但我相信是可以做到的(只要不是一次在太多actor中做)。

这篇文章建议将阻塞preStart作为解决问题的一种方法,因此推测阻塞preStart是安全的。

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

此外,在不安全的情况下阻止,什么是安全的选择?

4

2 回答 2

1

在以下情况下阻止是相对安全的receive

  1. 被阻塞的actor的总数远小于工作线程的总数。默认情况下有 10 个工作线程,所以 1-2 个阻塞的 actor 就可以了

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

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

于 2013-01-24T17:42:16.163 回答
1

永远不要阻止演员。

如果您的参与者是参与者层次结构的一部分(并且应该是),那么参与者系统无法阻止它。演员的生命周期(监督、监视等)是通过消息传递完成的。停止一个阻塞子的父actor是行不通的。

也许有办法将阻塞条件与演员的生命周期结合起来。但这会导致过度复杂化和不良作风。

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

于 2013-02-20T20:46:15.433 回答