运行akka actors列表以获取消息列表

wlk*_*wlk 4 scala akka

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

输入

message_1
message_2
message_3
Run Code Online (Sandbox Code Playgroud)

每条消息的输出:

1
2
3
Run Code Online (Sandbox Code Playgroud)

会运行3个akka演员一次将每个参数从列表传递到每个参数,我想稍后将这些结果用作List答案.理想情况下,我正在寻找可以让我跟随的操作:

runActorsForListAndWaitForAnswer(messagesList).map(_.toInt()).sum
Run Code Online (Sandbox Code Playgroud)

我不知道这种方法是否存在,但它会有所帮助.任何帮助表示赞赏,谢谢!

Tom*_*icz 13

首先,你必须放弃命令,阻止思维定势.一切都是异步的,Akka的味道最好.你永远不应该阻止,等待另一个演员的回复.相反,您可以获取Future[T]对象并在其上应用函数.该功能将被调用时,将来完成.

让我们举一个简单的例子:你有一个SquareActor取一个Int并返回它的正方形.要求回复的正确方法是:

squareActor ? 9 map {result =>
  println(result)  //81
}
//more code
Run Code Online (Sandbox Code Playgroud)

非常重要:代码块println不会阻塞.将立即执行更多代码,稍后将调用您的回调方法.

话虽如此,我们可以开始实施您的用例.如果我理解正确,你有一个演员列表和一个整数列表.您希望将每个整数发送到一个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}
Run Code Online (Sandbox Code Playgroud)

我故意留下明确的类型来帮助您遵循代码.让我们一步一步走:

  • actorsWithArguments是一个List元组.每个项目拥有一对演员和消息- (actor1, message1),(actor2, message2),...

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

  • futures是强类型的,因为我们知道每个回复都是Int.我们只是mapTo每个Future[Any]Future[Int]

  • futureOfAllResults从员工真正真棒改造List[Future[Int]]Future[List[Int]].换句话说,我们只是将未来结果列表转换为包含所有项目的单个未来结果.

  • future持有(将来会持有)你的结果.

如果您认为这是很多代码,那只是出于教育目的.链接和类型推断可以做到魔术:

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

最后你得到了你的结果.那么,你将来会得到.现在,如果您想将结果发送回另一个演员,您只需说:

future map {sum => otherActor ! sum}
//or even...
future map otherActor.!
Run Code Online (Sandbox Code Playgroud)

强烈建议您在官方文档中阅读有关期货的章节,以使其更加清晰.