【问题标题】:Message Class in Akka: Sending an array/buffer as a messageAkka 中的消息类:将数组/缓冲区作为消息发送
【发布时间】:2015-11-05 08:26:41
【问题描述】:

我最近开始使用 Scala 学习 Akka 框架。我知道如果我们想将变量作为消息的一部分发送,我们可以使用如下所示的消息类:

case class Work(start: Int, nrOfElements: Int) extends PiMessage

如何将数组作为此类消息的一部分发送?例如。下面的行不起作用。

case class WorkSend(buff: Array[Int],Dim : Int)

编辑:

我收到以下代码的越界异常:

case class WorkSend(buff: Array[Int], Dim : Int)

在大师:

val buff = Array[Int](10)
     for (i <- 0 to Dim - 1) //Dim is 10
        buff(i) = matrixA(0)(i)
     worker ! WorkSend(buff)

在工人处:

def receive = {
      case WorkSend(buff) =>

        for (i <- 0 to 9)
        println("Item received: " + buff(i))
        println("Work Done")
        sender ! WorkDone

    }

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    为什么不呢?

    import akka.actor._
    
    
    case class Start(buf: Array[String]) {
      override def toString = buf.mkString("->")
    }
    
    object Local extends App {
    
      implicit val system = ActorSystem("LocalSystem")
      val localActor = system.actorOf(Props[LocalActor], name = "LocalActor")  
      localActor ! Start(Array("A", "B", "C"))                                                          
    }
    
    class LocalActor extends Actor {
      def receive = {
        case s: Start =>
          println("LocalActor got: " + s)
      }
    }
    

    LocalActor 得到:A->B->C

    --

    问题有点不同。 如何从矩阵复制(数组数组到数组) 答:您不需要创建任何中间缓冲区。只需使用矩阵作为向量并将其传递给演员。

    scala> val m = Array(Array(1,2), Array(3,4))
    m: Array[Array[Int]] = Array(Array(1, 2), Array(3, 4))
    
    scala> m(1)
    res38: Array[Int] = Array(3, 4)
    
    WorkSend(m(1))
    

    【讨论】:

    • 您在哪一行看到异常? buff(i) = matrixA(0)(i) ?检查此数据结构的维度。
    • val buff = Array[Int](10) - 这一行只创建一个元素的数组。不是十个数组!
    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2022-01-20
    • 2013-03-07
    相关资源
    最近更新 更多