Акка: как отключить актера, чтобы он не заканчивался

(отказ от ответственности: я менее начинающий с аккой)

Предположим, у меня есть актер, вызывающий метод, который никогда не завершается (это крайний пример, вы можете подумать о вызове метода, который может завершиться в течение длительного времени или никогда).

Например (Java)

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

Теперь, если во время обработки сообщения актер вызывает

InfiniteLoop.neverReturns()

актер никогда не закончится.

Есть ли способ убить его, пока он еще обрабатывает сообщение? Если да, будет ли цикл продолжаться в фоновом режиме?

(я пытаюсь понять, есть ли способ восстановления после ошибки типа "бесконечный цикл" в системе akka)

1 ответ

Решение

Нет способа реализовать такую ​​вещь в Akka. Все методы для остановки актера основаны на отправке сообщения актеру. Если ваш актер застрял, обрабатывая текущее сообщение из-за цикла, он никогда не обработает сообщение, приказывающее остановить его. Это основа модели актера akka, сообщения в почтовом ящике обрабатываются по порядку, и я не думаю, что вы можете найти способ обойти это. Проверьте эту статью, чтобы узнать, как остановить / убить актера: https://petabridge.com/blog/how-to-stop-an-actor-akkadotnet/. Вы увидите, как меняется семантика остановки для каждого метода, но все они начинаются с отправки сообщения субъекту.

Было бы неплохо узнать, зачем вам это нужно, потому что, возможно, ваши базовые требования могут быть реализованы более понятным способом. Например, потенциально блокирующее действие может быть перенесено в будущем, если актер сможет перейти к следующему сообщению.

Другие вопросы по тегам