Await.result 总是挂起/超时并且从不返回结果(Scala - Akka 演员)

问题描述 投票:0回答:1

简而言之,我正在尝试制作一个计算斐波那契数的 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
        }
    }
}

解决此问题的最简单方法是什么?

网上搜索,没有得到任何有用的结果。

scala akka actor
1个回答
0
投票

Actor 一次处理一条消息,并且在

receive
返回当前消息之前不会处理下一条消息。参与者无法向自身发送消息,然后阻塞等待回复,因为在对第一条消息的
receive
调用完成之前无法处理第二条消息。所以
Await.result((self ? ...
总是会阻塞,直到
?
超时。

简单的修复方法是将两个查询发送到

child
,而不是将第一个查询发送到
self
。这将是非常低效的,并且可能会耗尽大量资源,但至少它不会挂起。

还值得注意的是,斐波那契数列的前两项是

1
,而不是
0
。按照目前的情况,代码将始终返回
0

© www.soinside.com 2019 - 2024. All rights reserved.