Sku*_*uge 5 concurrency loops scala actor
我正试图让一个演员'去睡觉'等待另一个演员的信号.我想做的事情如下:
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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我的演员睡觉时,其他消息会发生什么?他们会被放弃吗?我不想失去他们.解决这个问题的好方法是什么?
您可以在react块中的其他情况下使用保护,react块中的不匹配消息保存在actor的消息队列中.要小心,在队列大小过大之前,演员肯定会被"吵醒".
如果我没记错的话,由于反应的设计,你只能在循环中有一个反应块.
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"
Run Code Online (Sandbox Code Playgroud)
唤醒处理消息1处理消息2处理消息3处理消息4
您可以使用与Don类似的机制,但可以利用以下andThen功能Actor.Body:
def waitForSignal : () => Unit = react { case Signal(_) => }
def processMessages : () => Unit = loop {
react {
case x => //process
}
}
def act() = waitForSignal andThen processMessages
Run Code Online (Sandbox Code Playgroud)
显式返回类型声明的原因() => Unit是因为react永远不会正常终止(即返回Nothing).Nothing位于类型层次结构的底部,是任何其他类型的有效子类型.
我正在利用从a () => Unit到Body包含该andThen方法的类的隐式转换.
| 归档时间: |
|
| 查看次数: |
1223 次 |
| 最近记录: |