Акка: как отключить актера, чтобы он не заканчивался
(отказ от ответственности: я менее начинающий с аккой)
Предположим, у меня есть актер, вызывающий метод, который никогда не завершается (это крайний пример, вы можете подумать о вызове метода, который может завершиться в течение длительного времени или никогда).
Например (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/. Вы увидите, как меняется семантика остановки для каждого метода, но все они начинаются с отправки сообщения субъекту.
Было бы неплохо узнать, зачем вам это нужно, потому что, возможно, ваши базовые требования могут быть реализованы более понятным способом. Например, потенциально блокирующее действие может быть перенесено в будущем, если актер сможет перейти к следующему сообщению.