gpt4 book ai didi

scala - akka 将任务拆分为更小的结果并折叠结果

转载 作者:行者123 更新时间:2023-12-04 19:31:10 24 4
gpt4 key购买 nike

问题是关于Akka actors 库的。 A 想将一项大任务拆分成更小的任务,然后将它们的结果折叠成一个“大”结果。这将给我更快的计算利润。较小的任务如果是独立的,则可以并行计算。

假设我们需要像这样计算一些东西。函数 count2X 非常耗时,因此在一个线程中多次使用它并不是最佳选择。

//NOT OPTIMAL
def count2X(x: Int) = {
Thread.sleep(1000)
x * 2
}

val sum = count2X(1) + count2X(2) + count2X(3)
println(sum)

问题来了。

如何派发任务收集结果然后折叠,都是用akka actors?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)

感谢您的帮助。

最佳答案

在 Akka 中我会做这样的事情:

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 并行完成后开始对结果求和,对于简单的任务没问题,但通常你不应该等待这么久

关于scala - akka 将任务拆分为更小的结果并折叠结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14005650/

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