2015-11-01 55 views
0

我正在尝试使用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 

    } 
    } 

} 
+0

使用Actors进行矩阵乘法的任何特定原因?有一篇非常好的博客文章解释了为什么期货或并行集合是矩阵多重计算的更好选择... https://www.chrisstucchio.com/blog/2013/actors_vs_futures.html –

+0

例如scala.collection.parallel。 mutable.ParArray.fill将提供一个多线程多维数组,它将并行计算地图,过滤器等。 –

+0

我没有看到您的代码运行到无限循环。究竟发生了什么? –

回答

3

问题是与模式匹配你创建的对象。它匹配不当。不要用物体打扰自己。使用字符串例如:

object A { 
    val masterSend = "masterSend" 
    val workSend = "workSend" 
    val workDone = "workDone" 
} 
object MatrixMultiply { 



    val usage = """ 
       Usage: MainStart <matrix-dimension> <high-value> 
       """ 

    def main(args: Array[String]) { 
    val Dim = 3 
    val Max = 2 
    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 ! A.masterSend 

    } 

    class Master(Dim: Int, Max: Int, worker : ActorRef) extends Actor { 
    def receive = { 
     case A.masterSend => 
     println("Master sent") 
     worker ! A.workSend 
     case A.workDone => 
     println("Work was done!!") 
     context.system.shutdown() 
    } 
    } 

    class Worker extends Actor { 
    def receive = { 
     case A.workSend => 
     println("Work Done") 
     sender ! A.workDone 

    } 
    } 

} 

您已经从小写字母命名您的对象。 object messageSend 但模式匹配认为它不是一个对象,而是作为一个新的变量。

case messageSend => messageSend - 是一个变量 你可以在这里写任何东西case magicBall =>也可以编译。

+0

哇。非常感谢你。的确命名案件对象是错误的。当我为第一个字母使用大写字母时,它工作正常。 – Vandana

+0

你也可以使用这样的命名,但在case语句中,你必须用后引号''masterSend'' – Rumoku