Scala演员和丢弃的条目

时间:2012-08-22 20:37:29

标签: scala actor

我有一个scala actor实现,基本上是平均值。我推了一个条目,维护一个总计和一个计数,并找出平均值。发生的事情是,当我在测试期间以紧凑的循环运行时,我错过了一个条目,我相信这是最后一个。 演员是这样的:

val actor = new Actor { def act = react { 
  case v: Long => addEntry(v); act
  case _ => ()
}}.start()

编辑:addEntry的实现是:

  private def addEntry(v: Long) {
    total = total + v
    count = count + 1
    avg   = total / count
  }

并且添加基本上是actor ! 10,依此类推

我在测试中调用stop后,我等待大约200ms以确保队列处理完毕。 (或者我认为这就是我在做什么,问题出在哪里?)

Edit2:基本上,我认为现在因为我在紧密循环中设置这些值然后立即调用exit,最后一个或多个条目未被处理或被删除。我在循环结束之间放了一个小睡眠(实际上它是一个CountDownLatch.await和actor.stop,现在我不能让测试失败。

1 个答案:

答案 0 :(得分:0)

只要您获得react,您的实施只会输入Long,否则会停止。您可以使用loop(相当于while (true))对其进行换行,然后添加匹配的表达式来阻止actoractor ! 10case v: Long => ...不匹配,因为Int已发送给演员,因此演员将停止。

val actor = new Actor {
  def act() = { 
    loop { 
      react {
        case "stop" => exit()      // you might create a messageobject instead
        case l: Long => addEntry(l)
        case i: Int => addEntry(i.toLong)
      }
    }
  }
}.start()

这是我的建议。