Как заставить scala агента 'ожидать сигнала', но не освобождает сообщений?

Я пытаюсь заставить агента 'заснуть', ожидая другого сигнала агентов. Я хочу сделать что-то как:

def act(){
    loop{ //Should I use loop here too??
        if(sleepy){
            react{
                   //SLEEPING
                    case "Wake Up"=> sleepy=false; //just to breack the react
            }
        }else{
            react{
                 //React to other messages
            }
        }
    }
}

Теперь, что happends с другими сообщениями, когда мой агент спит? они получают discarted? Я не хочу терять их. Что хороший путь состоит в том, чтобы зафиксировать это?

5
задан Skuge 15 July 2010 в 13:58
поделиться

2 ответа

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

Если я правильно помню, у вас может быть только один блок реакции в цикле из-за конструкции реакции.

val receiver = new Actor {
  private var sleeping = true

  def act {
    loop {
      react {
        case "Wake Up"       => println("waking up"); sleeping = false
        case x if ! sleeping => println("processing "+x)
      }
    }
  }
}

receiver.start

import Thread.sleep

receiver ! "Message 1"
sleep(2000L)
receiver ! "Message 2"
sleep(2000L)
receiver ! "Wake Up"
sleep(2000L)
receiver ! "Message 3"
sleep(2000L)
receiver ! "Message 4"

просыпаться обработка сообщения 1 обработка сообщения 2 обработка сообщения 3 обработка Сообщения 4

6
ответ дан 18 December 2019 в 16:35
поделиться

Вы можете использовать механизм, аналогичный Дону, но воспользоваться функциональностью andThen , предоставляемой Actor.Body :

def waitForSignal : () => Unit = react { case Signal(_) => }

def processMessages : () => Unit = loop { 
  react {
      case x => //process
  }
}

def act() = waitForSignal andThen processMessages

Причина явного объявления типа возвращаемого значения () => Модуль вызван тем, что response никогда не завершается нормально (т.е. возвращает Nothing ). Ничто не находится внизу иерархии типов и является допустимым подтипом любого другого типа.

Я использую неявное преобразование из () => Unit в класс Body , который содержит метод andThen .

6
ответ дан 18 December 2019 в 16:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: