【问题标题】:Akka: how to shut down an actor that it's not terminatingAkka:如何关闭没有终止的演员
【发布时间】:2018-04-20 07:13:52
【问题描述】:

(免责声明:我不是 akka 的初学者)

假设我有一个演员调用了一个永不终止的方法(这是一个极端的例子,你可以考虑调用一个有机会在很长一段时间内终止或永远不会终止的方法)。

例如(Java)

public static class InfiniteLoop{
    public static int neverReturns(){
        int x = 0;
        while(true){
        int++;
        }
        return x;
    }
}

现在,如果在处理消息时,参与者调用

InfiniteLoop.neverReturns()

演员永远不会终止。

有没有办法在它仍在处理消息时杀死它?如果是,循环会在后台继续吗?

(我想了解的是,是否有办法从 akka 系统中的“无限循环”式故障中恢复)

【问题讨论】:

    标签: java akka akka-actor


    【解决方案1】:

    没有办法在 Akka 中实现这样的事情。所有停止演员的方法都依赖于向演员发送消息。如果你的actor因为循环而在处理当前消息时卡住了,它永远不会处理告诉它停止的消息。这是 akka actor 模型的基础,邮箱中的消息是按顺序处理的,我认为您找不到解决方法。查看这篇文章,了解有关停止/杀死演员的选项:https://petabridge.com/blog/how-to-stop-an-actor-akkadotnet/。您将看到每个方法的停止语义如何变化,但它们都是从向参与者发送消息开始的。

    很高兴知道您为什么需要这样的东西,因为也许您的基本需求可以以更 akka-ish 的方式实现。例如,如果参与者可以传递到下一条消息,则可以将潜在的阻塞操作包装在未来中。

    【讨论】:

    • 如果我让你好起来,你建议:将调用包装在 Future 中,然后在超时后调用 cancel(true) 。这样能保证任务中断吗?
    • 我其实觉得不保证任务的中断,你得自己处理。我是一个初步的建议,你必须看看什么对你有用
    • 你可以从这里得到处理它的想法:techblog.bozho.net/interrupting-executor-tasks
    • 不过要小心这个未来的事情,如果你同时执行许多这样的操作,你应该使用一个专用的调度程序。无论如何,如果您有特定的用例,请尝试发布它,因为可能有替代方法,
    • “强制”停止一个正在运行的线程在 JVM 上基本上是不可能可靠地做到的——事实上techblog.bozho.net/interrupting-executor-tasks 确实提供了一些很好的背景。
    猜你喜欢
    • 1970-01-01
    • 2014-07-11
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-01
    相关资源
    最近更新 更多