我开始学习Akka,在许多官方例子中,我看到使用tell模式实现了请求 – 响应.即在工人完成工作后,他将结果作为新消息发送给发件人.例如,在
this Pi近似官方教程中展示了如何设计应用程序,其中Master向工作人员发送一些工作,然后等待结果作为另一条消息.
主码:
def receive = {
case Calculate ⇒
for (i ← 0 until nrOfMessages) workerRouter ! Work(i * nrOfElements,nrOfElements)
case Result(value) ⇒
pi += value
nrOfResults += 1
if (nrOfResults == nrOfMessages) {
// Send the result to the listener
listener ! PiApproximation(pi,duration = (System.currentTimeMillis - start).millis)
// Stops this actor and all its supervised children
context.stop(self)
}
}
工人代码:
def receive = {
case Work(start,nrOfElements) ⇒
sender ! Result(calculatePiFor(start,nrOfElements)) // perform the work
}
但我想知道为什么这个例子没有使用ask模式?在这里使用ask模式有什么问题?
如果可以在这里使用ask模式,那么我还有另一个问题:如何在完成工作后停止所有工人演员?
>我的工作人员应该向自己发送PoisonPill消息吗?
>或者应该是大师演员广播(PoisonPill)?
>还是有另一种更优雅的方式?