考虑以下代码段描述的情况
class MyActor extends Actor {
def receive = {
case msg: String =>
val f: Future[Long] = <some future>
f pipeTo self
context.become(afterFuture)
}
def afterFuture: Receive = {
case futureResult: Long =>
// process the future result
}
}
因此,我们有一个开始执行未来的演员,将结果传递给自己。然后它会改变它的行为,以便能够处理未来的结果。 是否有可能在调用context.become生效之前终止,因此演员无法处理未来的结果?
我的猜测是,它不是因为当前消息(msg:String)的处理只会在context.become生效后终止,此时邮箱中的下一条消息将被处理并且新的行为已经到位。尽管如此,我还是希望得到其他人的肯定,这些人肯定比我更了解。
答案 0 :(得分:1)
不,您在处理下一条消息之前将完成对context.become
的呼叫。在那种情况下没有竞争条件。