Я пытаюсь написать простую программу умножения матрицы с параллельной обработкой с использованием актеров 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
}
}
}
Любые конкретные причины использования Актеры для матричного умножения? Есть очень хорошее сообщение в блоге, объясняющее, почему Futures или параллельные коллекции - лучший выбор для вычислений, таких как матрица mult ... https://www.chrisstucchio.com/blog/2013/actors_vs_futures.html –
Например, scala.collection.parallel. mutable.ParArray.fill предоставит многопоточный многомерный массив, который будет вычислять карты, фильтры и т. д. параллельно. –
Я не видел, чтобы ваш код работал в бесконечном цикле. что именно происходит? –