Я пытаюсь заставить агента 'заснуть', ожидая другого сигнала агентов. Я хочу сделать что-то как:
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? Я не хочу терять их. Что хороший путь состоит в том, чтобы зафиксировать это?
Вы можете использовать защиту в других случаях в блоке реакции, несогласованные сообщения в блоке реакции хранятся в очереди сообщений актера. Будьте осторожны, актера обязательно «разбудят» до того, как размер очереди станет чрезмерным.
Если я правильно помню, у вас может быть только один блок реакции в цикле из-за конструкции реакции.
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
Вы можете использовать механизм, аналогичный Дону, но воспользоваться функциональностью 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
.