scala – 何时在Akka中使用Ask模式
发布时间:2020-12-16 18:05:38 所属栏目:安全 来源:网络整理
导读:我开始学习Akka,在许多官方例子中,我看到使用tell模式实现了请求 – 响应.即在工人完成工作后,他将结果作为新消息发送给发件人.例如,在 this Pi近似官方教程中展示了如何设计应用程序,其中Master向工作人员发送一些工作,然后等待结果作为另一条消息. 主码:
我开始学习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消息吗? 解决方法
在将Actor与Future API集成时,ask很有用,但它们确实会引入一些开销.此外,Future完成不是通过actor的邮箱来进行的,而是安排在与邮箱使用的线程分开的线程上,这意味着在actor中接收未来的完成会引入进行多线程协调的需要.
同时,如果您使用tell发送给工作人员并将其告知发送者作为响应,则通信将始终通过邮箱通道正常流动. 此外,如果演员通过接收而不是通过接收和其他作为完成的询问消息进入,则更容易辨别演员处理的输入. 为了解决PoisonPill问题,答案可能取决于.您可以选择每个消息的工作方法,在这种情况下,工作人员应该自杀.相反,如果您使用工作池,则可以让主管负责上下调整该池,让它发送PoisonPill或让工作人员闲置时间,再次自杀. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读