gpt4 book ai didi

scala - 运行 akka actor 列表以获取消息列表

转载 作者:行者123 更新时间:2023-12-01 23:42:42 25 4
gpt4 key购买 nike

我是 akka 的新手,我想立即运行一个 akka actor 列表来获取消息列表,例如(我在这里使用 scala):

输入

message_1
message_2
message_3

每条消息的输出:

1
2
3

将同时运行 3 个 akka 参与者,将列表中的每个参数传递给每个参与者,我想稍后将这些结果用作答案的 List 。理想情况下,我正在寻找能给我以下结果的操作:

runActorsForListAndWaitForAnswer(messagesList).map(_.toInt()).sum

我不知道这样的方法是否存在,但它会很有帮助。感谢任何帮助,谢谢!

最佳答案

首先你必须放弃命令式、阻塞式的思维模式。当一切都是异步的时,Akka 的味道最好。你不应该阻塞,等待另一个 Actor 的回复。相反,您可以采用 Future[T] 对象并对其应用函数。 future 完成时将调用此函数。

让我们举个例子:您有一个 SquareActor,它接受一个 Int 并返回它的一个平方。请求回复的正确方法是:

squareActor ? 9 map {result =>
println(result) //81
}
//more code

非常重要:带有 println 的代码块不会阻塞。 更多代码将立即执行,并且您的回调方法将在一段时间后被调用。

话虽如此,我们可以开始实现您的用例。如果我理解正确的话,你有一个 Actor 列表和一个整数列表。您希望将每个整数发送给一个 Actor 。这是一个伪代码:

val actors: List[ActorRef] = //...
val numbers: List[Int] = //...
val actorsWithArguments: List[(ActorRef, Int)] = actors zip numbers
val futuresOfAny: List[Future[Any]] = actorsWithArguments map { case (actor, number) => actor ? number}
val futures: List[Future[Int]] = futuresOfAny map {_.mapTo[Int]}
val futureOfAllResults: Future[List[Int]] = Future.sequence(futures)
val future: Future[Int] = futureOfAllResults map { _.sum}

我故意留下显式类型来帮助您遵循代码。让我们一步一步来:

  • actorsWithArguments 是元组的List。每个项目都包含一对 actor 和一条消息 - (actor1, message1), (actor2, message2), ...

  • futuresOfAny 包含 actor 的 Future 结果列表? number 调用。 ? 返回一个 Future[Any] 因为:a) 结果未知,b) Akka 不知道结果的类型是什么(回复消息) )

  • futures 是强类型的,因为我们知道每个回复都是一个 Int。我们将每个 Future[Any] 映射到 Future[Int]

  • futureOfAllResults 采用了从 List[Future[Int]]Future[List[Int]] 的非常棒的转换。换句话说,我们只是将 future 结果列表转换为包含所有项目的单个 future 结果。

  • future 保留(将来将会保留)您的结果。

如果您认为代码很多,那它只是出于教育目的。链接和类型推断可以发挥神奇作用:

val future = Future.sequence(actors zip numbers map { case (actor, number) => actor ? number} map { _.mapTo[Int]}) map { _.sum} }

终于得到结果了。好吧,您将来将会。现在,如果您想将该结果发送回另一个 Actor ,您可以说:

future map {sum => otherActor ! sum}
//or even...
future map otherActor.!

强烈鼓励您阅读chapter on Futures在官方文档中让这一切变得更清楚。

关于scala - 运行 akka actor 列表以获取消息列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14307406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com