【问题标题】:When is it safe to block in an Akka 2 actor?什么时候可以安全地阻止 Akka 2 演员?
【发布时间】:2013-01-24 15:54:19
【问题描述】:

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

This post 建议阻塞 preStart 作为解决问题的一种方法,因此大概阻塞 preStart 是安全的。

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

此外,在不安全的情况下阻止,什么是安全的替代方案?

【问题讨论】:

    标签: akka


    【解决方案1】:

    receive中屏蔽比较安全:

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

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

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

    【讨论】:

    • 这是一个很好的解释。我认为主要的一点是阻塞会占用一个线程。过多的阻塞会减慢你的程序。您应该始终尝试使用非阻塞操作。
    【解决方案2】:

    永远不要屏蔽演员。

    如果您的演员是演员层次结构的一部分(应该是),演员系统无法阻止它。 演员的生命周期(监督、监视等)是通过消息传递完成的。 停止阻塞子节点的父 Actor 将不起作用。

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

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

    【讨论】:

    • 好吧,它会在阻塞操作完成时工作,成功或不成功。显然,如果它永远阻塞,就会有问题。这就是我在原来情况下遇到的问题。
    • 如果你阻止一个演员几秒钟,你的演员将变得没有反应。重新启动或应用程序关闭将在这段时间内冻结。这与容错的想法背道而驰。
    • 我实际上希望我的应用程序关闭被阻止,以便磁盘上的持久状态可以赶上内存中的内容。
    • 太容易被封了很久。所以我建议编写软件来接受错误。为此,演员应该随时处理停止消息。
    猜你喜欢
    • 2014-12-02
    • 2017-03-18
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多