我有一段代码(如下所示),我想让它在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)
}
}
首先,我想知道是否有可能。到目前为止,我所看到的并发编程示例只是关于聊天室,消息和相当简单的东西,但是这个块涵盖了一系列进行数值运算的方法(即align
,getChainRmsd
和ca1
ca2
是ArrayBuffer
个Double
坐标值的{{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))