我正在尝试使用Scala和Akka actors来编写一个简单的矩阵乘法程序并发处理。我甚至没有写过10%的代码,我遇到了麻烦。我创建了两个演员 - 主人和工作人员。我试图在他们之间进行沟通,但它的运行陷入了无限循环。任何建议都非常感谢。正如你所看到的,下面的代码什么都不做,它会在master中打印2个10X10矩阵,然后调用worker。但工作人员的workDone消息永远不会回到主人手中。我也怀疑这做什么用警告我得到:可变模式之后Akka actor无限循环
模式无法比拟的(内接受大师的情况下,“masterSend”)
import akka.actor.{ActorRef, Actor, ActorSystem, Props}
import scala.Array._
import scala.util.Random
case object masterSend
case object workSend
case object workDone
object MatrixMultiply {
val usage = """
Usage: MainStart <matrix-dimension> <high-value>
"""
def main(args: Array[String]) {
if (args.length != 2) {
println(usage)
System.exit(1)
}
val Dim = args(0).toInt
val Max = args(1).toInt
val system = ActorSystem("ComputeSystem")
val worker = system.actorOf(Props[Worker], name = "worker")
val master = system.actorOf(Props(new Master(Dim, Max, worker)), name = "master")
master ! masterSend
}
class Master(Dim: Int, Max: Int, worker : ActorRef) extends Actor {
def receive = {
case masterSend =>
val r = new Random(34636)
val matrixA = ofDim[Int](Dim,Dim)
val matrixB = ofDim[Int](Dim,Dim)
println("Matrix A: ")
for (i <- 0 to Dim - 1) {
for (j <- 0 to Dim - 1) {
matrixA(i)(j) = r.nextInt(Max)
print(matrixA(i)(j) + " ")
}
println()
}
r.setSeed(23535)
println("Matrix B: ")
for (i <- 0 to Dim - 1) {
for (j <- 0 to Dim - 1) {
matrixB(i)(j) = r.nextInt(Max)
print(matrixB(i)(j) + " ")
}
println()
}
worker ! workSend
case workDone =>
println("Work was done!!")
context.system.shutdown()
}
}
class Worker extends Actor {
def receive = {
case workSend =>
println("Work Done")
sender ! workDone
}
}
}
使用Actors进行矩阵乘法的任何特定原因?有一篇非常好的博客文章解释了为什么期货或并行集合是矩阵多重计算的更好选择... https://www.chrisstucchio.com/blog/2013/actors_vs_futures.html –
例如scala.collection.parallel。 mutable.ParArray.fill将提供一个多线程多维数组,它将并行计算地图,过滤器等。 –
我没有看到您的代码运行到无限循环。究竟发生了什么? –