在Scala中使用数学运算的方法的Actor或Future

时间:2014-02-06 12:29:47

标签: scala concurrency actor future

我有一段代码(如下所示),我想让它在Scala中同时工作。

    for(i <- 0 until ca1.length){
      for(j <- 0 until ca2.length){
        val afpchain = algorithm.align(ca1(i), ca2(j))
        afpchain.setName1(label1(i))
        afpchain.setName2(label2(j))
        println(label1(i) + " " + label2(j) + afpchain.getChainRmsd + " " + afpchain.getCalculationTime )
        results.write(label1(i) + " " + label2(j) + " " + afpchain.getChainRmsd + "\n")
        val num1 = new Number(j+1,i+1,afpchain.getChainRmsd(),Format)
        sheet.addCell(num1)
      }
    } 

首先,我想知道是否有可能。到目前为止,我所看到的并发编程示例只是关于聊天室,消息和相当简单的东西,但是这个块涵盖了一系列进行数值运算的方法(即aligngetChainRmsdca1 ca2ArrayBufferDouble坐标值的{{1}}个。{你会告诉我什么,我该如何编写代码?

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

嗯......假设你有一个演员,为每条消息产生一个工人演员并为你计算数字(以及你需要的任何可并行化的),你可以用以下方法查询: / p>

val theNum = ask(myActor, new MyMessage(i, j))

MyMessage只是您在MyActor的伴随对象中定义的案例类:

case class MyMessage(i: Int, j: Int)
好的,这很好,现在我们可以做到(在我的头顶,可能有错误):

val myNums = 
  for(i <- 0 until ca1.length) yield {
    for(j <- 0 until ca2.length) yield {
      theNum <- ask(myActor, new MyMessage(i, j)).mapTo[Number]       
    }
  }

所以你的结果可以被抓住:(为了简单而使用Await,而不是因为我喜欢它):

val result = Await.result(myNums, 10 seconds).flatten.asInstanceOf[Seq[Number]]

现在你想要预测结果,进行打印/记录并在你的“表格”中添加数字(无论是什么) - 假设你没有在演员中照顾它(取决于我认为你的表是什么以及你需要什么。

注意:你也可以通过以下方式使myActor成为路由器:

val myActor = context.actorOf(Props[MyActor].withRouter( RoundRobinRouter(nrOfInstances = 10))