当前位置: 首页 > 知识库问答 >
问题:

akka将任务分解为更小的部分,并将结果折叠起来

归誉
2023-03-14

问题是关于阿克卡演员图书馆。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)

谢谢你的帮助。

共有2个答案

钮善
2023-03-14

你可以做两件事:

1)使用Akka期货。这些允许您以异步方式调度操作和折叠操作。查看http://doc.akka.io/docs/akka/2.0.4/scala/futures.html了解更多信息。

2) 您可以将工作分派给多个“工作”参与者,然后让一个“主”参与者对其进行聚合,通过在消息中存储信息来跟踪哪些消息处于挂起/处理状态。我这里有一个使用Akka actors的简单股票报价示例:https://github.com/ryanlecompte/quotes

章威
2023-03-14

在阿卡,我会这样做:

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]

我相信有一个更好的方法——在所有的未来的-s并行完成后,在这里开始计算结果,对于简单的任务来说,这是可以的,但一般来说,你不应该等待太久

 类似资料:
  • 我在收集JSON的Nifi中获得了一些数据,但是它需要插入的表具有不同的格式。 我很难将JSON结构分解成更小的部分--第二个部分似乎是两三个部分的转变。有什么想法能让我进入下一步吗? 产出:

  • 问题内容: 订单表具有如下数据: 运算符表: 组表: 如您所见,约翰有3个订单,凯特(Kate),威尔(Will),杰克(Jack)和山姆(Sam)没有。 现在,我想根据某些条件将操作员分配给订单: 订单现金必须大于0 订单必须具有状态= 1 订单必须在组1或2中 操作员必须处于活动状态(active = 1) 操作员必须在组1或2中 这是我想要得到的结果: 我想重新整理订单并更新operator

  • 问题内容: 我有一个具有以下布局的表: 我想将表转换为如下所示的布局: 我在PostgreSQL中使用SQL。有没有一种简单的方法(且内存效率高)来做到这一点?我看过一些提到使用透视的帖子,但是我不确定这是否行得通,而且我看到的描述似乎是针对Oracle的。 问题答案: 如果尚未安装,请首先安装扩展tablefunc。每个数据库需要做一次。 你需要的PostgreSQL 9.1 的。在旧版本中,您

  • 问题内容: 是否存在将数字分割成两个部分(即整数部分和小数部分)的有效方法? 问题答案: 用途:

  • 我尝试使用Java8Lambda表达式和流来解析一些日志。我有一个巨大的日志文件,运行了一次又一次。我想把它分成不同的集合,每次运行一个集合。我不知道日志在advanced中运行了多少次。为了锻炼我非常虚弱的lambda肌肉,我想在列表中一次完成。 这是我目前的实现: 这里基本上类似于TomekRekawek的解决方案,但首先是未知的分区大小。

  • 但是如果settings.gradle不在那里,那么它当前似乎会默默地失败:构建会正常进行。 如果此必需的任务失败,我希望防止生成发生。为此,在我看来,我需要两件事:确定找不到文件的方法,然后在任务上设置“失败”标志的方法...什么的。 试图解决这个问题使我找到了,然后找到了copysourcespec.from...但我一点也不知道。 当然,我可以使用非DSL Groovy复制并执行成功检查。但