1

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

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 后,我等待大约 200 毫秒以确保队列得到处理。(或者我认为这就是我正在做的,这是问题所在吗?)

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

4

1 回答 1

0

react只要您获得 a ,您的实现就会进入,Long否则它会停止。你可以用 包装它loop,这相当于while (true),并添加一个匹配的表达式来停止它actoractor ! 10将不匹配case v: Long => ...,因为 anInt已发送给演员,因此演员将停止。

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()

这将是我的建议。

于 2012-08-23T05:53:42.327 回答