Akka:如何关闭一个没有终止的演员

Akka: how to shut down an actor that it's not terminating

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

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

例如(Java)

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

现在,如果在处理消息时,演员调用

InfiniteLoop.neverReturns()

演员永远不会终止。

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

(我想了解的是,是否有办法从 akka 系统中的 "infinite loop" 式故障中恢复)

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

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