2015-11-01 2 views
0

Я пытаюсь написать простую программу умножения матрицы с параллельной обработкой с использованием актеров Scala и Akka. Я даже не написал 10% кода, и у меня проблемы. Я создал двух актеров - мастера и рабочего. Я пытаюсь установить связь между ними, но он работает в бесконечном цикле. Любые предложения действительно оценены. Как вы можете видеть, код ниже ничего не делает, он печатает 2 матрицы 10X10 в главном, после чего вызывается рабочий. Но сообщение workwork рабочего рабочего никогда не возвращается к мастеру. Я также подозреваю, что это что-то делать с предупреждением я получаю: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

Любые конкретные причины использования Актеры для матричного умножения? Есть очень хорошее сообщение в блоге, объясняющее, почему Futures или параллельные коллекции - лучший выбор для вычислений, таких как матрица mult ... 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

Также вы можете использовать такое наименование, но в случае вы должны обернуть обратные кавычки '' masterSend'', – Rumoku

Смежные вопросы