问题是关于Akka演员库。一个想要把一个大任务分成小任务,然后把它们的结果折叠成一个“大”的结果。这将给我更快的计算利润。如果小任务是独立的,则可以并行计算它们。
假设我们需要像这样计算。函数count2X是耗时的,因此在一个线程中多次使用它并不是最优的。
//NOT OPTIMAL
def count2X(x: Int) = {
Thread.sleep(1000)
x * 2
}
val sum = count2X(1) + count2X(2) + count2X(3)
println(sum)问题来了。
如何分派任务并收集结果,然后折叠,所有这些任务都使用akka参与者?是由Akka提供的,还是我需要自己实现?在这种方法中什么是最佳实践。
以下是对我问题的“视觉”解释:
/-> [SMALL_TASK_1] -\
[BIG_TASK] -+--> [SMALL_TASK_1] --> [RESULT_FOLD]
\-> [SMALL_TASK_1] -/下面是我的脚手架实现,缺少/坏的实现:)
case class Count2X(x: Int)
class Count2XActor extends Actor {
def receive = {
case Count2X(x) => count2X(x); // AND NOW WHAT ?
}
}
case class CountSumOf2X(a: Int, b: Int, c: Int)
class SumOf2XActor extends Actor {
val aCounter = context.actorOf(Props[Count2XActor])
val bCounter = context.actorOf(Props[Count2XActor])
val cCounter = context.actorOf(Props[Count2XActor])
def receive = {
case CountSumOf2X(a, b, c) => // AND NOW WHAT ? aCounter ! Count2X(a); bCounter ! Count2X(b); cCounter ! Count2X(c);
}
}
val aSystem = ActorSystem("mySystem")
val actor = aSystem.actorOf(Props[SumOf2XActor])
actor ! CountSumOf2X(10, 20, 30)谢谢你的帮助。
发布于 2012-12-24 00:49:21
在阿克卡,我会这样做:
val a = aCounter ? Count2X(10) mapTo[Int]
val b = bCounter ? Count2X(10) mapTo[Int]
val c = cCounter ? Count2X(10) mapTo[Int]
Await.result(Future.sequence(a, b, c) map (_.sum), 1 second).asInstanceOf[Int]我确信还有更好的方法--在所有Future-s并行完成之后,在这里开始对结果进行求和,对于简单的任务来说,没关系,但通常不应该等待太长时间
发布于 2012-12-22 19:13:34
你可以做两件事:
1)使用Akka期货。这些允许您以异步方式分派操作并折叠它们。有关更多信息,请访问http://doc.akka.io/docs/akka/2.0.4/scala/futures.html。
2)您可以将工作分派给多个“工人”参与者,然后让“主”参与者聚合它们,通过在消息本身中存储信息来跟踪哪些消息正在等待/处理。我有一个简单的股票报价例子,这里使用Akka演员:https://github.com/ryanlecompte/quotes
https://stackoverflow.com/questions/14005650
复制相似问题