简而言之,我正在尝试制作一个计算斐波那契数的 Scala actor 系统。但是,Await.result() 行总是超时,我不确定问题是什么。
class FibMachine extends Actor {
implicit val timeout: Timeout = Timeout(5L, TimeUnit.SECONDS)
override def receive: Receive = {
case 0 => sender ! 0
case 1 => sender ! 0
case x: Int if x > 1 => {
val child = context.actorOf(Props(new FibMachine()))
val self_num: Int = Await.result((self ? (x - 1)).mapTo[Int], timeout.duration)
val child_num: Int = Await.result((child ? (x - 2)).mapTo[Int], timeout.duration)
child ! PoisonPill
sender ! self_num + child_num
}
}
}
解决此问题的最简单方法是什么?
网上搜索,没有得到任何有用的结果。
Actor 一次处理一条消息,并且在
receive
返回当前消息之前不会处理下一条消息。参与者无法向自身发送消息,然后阻塞等待回复,因为在对第一条消息的 receive
调用完成之前无法处理第二条消息。所以 Await.result((self ? ...
总是会阻塞,直到 ?
超时。
简单的修复方法是将两个查询发送到
child
,而不是将第一个查询发送到 self
。这将是非常低效的,并且可能会耗尽大量资源,但至少它不会挂起。
还值得注意的是,斐波那契数列的前两项是
1
,而不是0
。按照目前的情况,代码将始终返回 0
。