如何从一个演员中的许多演员收集数据的最佳方法是什么?

时间:2012-05-10 11:05:09

标签: scala concurrency actor

如何从一个演员中的多个演员收集数据并在处理后将其发送给另一个演员? 我可能有自己的认识:

import scala.actors._

abstract class Message
case class DataMsg(id: String, value: String) extends Message
case class Done() extends Message

class DataSender(id: String, next: Actor) extends Actor {

    def act() {
        loop {
            react {
                case DataMsg(_, msg) => next ! DataMsg(id, msg)
                case Done() => {
                    println(id+" -> done")
                    exit()
                }
            }
        }
    }
}

class Concat(next: Actor, ids: Seq[String]) extends Actor {
    private val data = scala.collection.mutable.LinkedHashMap.empty[String, String]

    def act() {
        loop {
            react {
                case DataMsg(id, msg) => {
                    if (ids contains id) {
                        data(id) = msg
                        if (ids.size == data.keys.size) {
                            next ! DataMsg("", data.values.mkString)
                            data.clear
                        }
                    }
                }
                case Done() => {
                    println("Concat -> done")
                    exit()
                }
            }
        }
    }
}

class PrintData extends Actor {
    def act() {
        loop {
            react {
                case DataMsg(_, msg) => {
                    println("Data: " + msg)
                }
                case Done() => {
                    println("PrintData -> done")
                    exit()
                }
            }
        }
    }
}

val printData = new PrintData
val concat = new Concat(printData, Seq("f1", "f2", "f3"))
val f1 = new DataSender("f1", concat)
val f2 = new DataSender("f2", concat)
val f3 = new DataSender("f3", concat)

printData.start
concat.start
f1.start
f2.start
f3.start

f1 ! DataMsg("", "Hello")
f2 ! DataMsg("", " ")
f3 ! DataMsg("", "Wordl!")
Thread.sleep(1000)
f1 ! Done()
f2 ! Done()
f3 ! Done()
concat ! Done()
printData ! Done()

也许,有更好的解决方案。我考虑过期货,但我不确定是否有必要使用它们。如果Concat actor无法获得值,我该怎么办?

0 个答案:

没有答案