这是Scala 2.9.0.1 actor库的一个bug吗?

6

以下代码在Scala 2.8中运行良好,但在2.9.0.1中不行。请在REPL中复制并粘贴。在2.9.0.1中会抛出异常。

import scala.actors.Actor
import scala.actors.TIMEOUT

object A2 extends Actor {
  def act = {
    loop {
      react {
        case "hello" => 
          val s = sender 
          reactWithin(2000){
            case i:Int => s ! "hello"
            case TIMEOUT => s ! "TIMEOUT"
          }
        case _ => 
      }
    }
  }
}

object A1 extends Actor {
  def act = {
    loop {
      react {
        case m:String => println (A2 !? (1000, m))
        case _ =>
      }
    }
  }
}

A1.start
A2.start

A1 ! "hi"
A1 ! "hello"

如果异常没有立即被抛出,请多次执行A1 ! "hi"A1 ! "hello"。这是Scala 2.9.0.1中的一个bug,还是代码有问题?[编辑]忘记添加实际抛出的异常。
scala> $line4.$read$$iw$$iw$A1$@6be03fce: caught java.lang.RuntimeException: unhandled timeout
java.lang.RuntimeException: unhandled timeout
    at scala.sys.package$.error(package.scala:27)
    at scala.actors.Actor$class.receiveWithin(Actor.scala:606)
    at $line4.$read$$iw$$iw$A1$.receiveWithin(<console>:10)
    at scala.actors.Channel.receiveWithin(Channel.scala:71)
    at scala.actors.ActorCanReply$class.$bang$qmark(ActorCanReply.scala:32)
    at $line3.$read$$iw$$iw$A2$.$bang$qmark(<console>:9)
    at $line4.$read$$iw$$iw$A1$$anonfun$act$1$$anonfun$apply$1.apply(<console>:15)
    at $line4.$read$$iw$$iw$A1$$anonfun$act$1$$anonfun$apply$1.apply(<console>:13)
    at scala.actors.ReactorTask.run(ReactorTask.scala:31)
    at scala.actors.Reactor$class.resumeReceiver(Reactor.scala:129)
    at $line4.$read$$iw$$iw$A1$.scala$actors$ReplyReactor$$super$resumeReceiver(<console>:10)
    at scala.actors.ReplyReactor$class.resumeReceiver(ReplyReactor.scala:68)
    at $line4.$read$$iw$$iw$A1$.resumeReceiver(<console>:10)
    at scala.actors.Actor$class.searchMailbox(Actor.scala:500)
    at $line4.$read$$iw$$iw$A1$.searchMailbox(<console>:10)
    at scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(Reactor.scala:117)
    at scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply(Reactor.scala:114)
    at scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply(Reactor.scala:114)
    at scala.actors.ReactorTask.run(ReactorTask.scala:33)
    at scala.concurrent.forkjoin.ForkJoinPool$AdaptedRunnable.exec(ForkJoinPool.java:611)
    at scala.concurrent.forkjoin.ForkJoinTask.quietlyExec(ForkJoinTask.java:422)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.mainLoop(ForkJoinWorkerThread.java:340)
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:325)

编辑2:无REPL的独立程序

package scalaapplication5
import scala.actors.Actor._
import scala.actors.Actor
import scala.actors.TIMEOUT


object Main {
  A1.start
  A2.start
  def main(args: Array[String]): Unit = {
    while (true){
      A1 ! "hi"
      A1 ! "hello"
      Thread.sleep(1000)
    }
  }
}

object A2 extends Actor {
  def act = loop { 
    react {
      case "hello" =>
        val s = sender
        reactWithin(2000){
          case i:Int => s ! "hello"
          case TIMEOUT => s ! "TIMEOUT"
        }
      case _ =>
    }
  }
}

object A1 extends Actor {
  def act = {
    loop {
      react {
        case m:String => println (A2 !? (1000, m))
        case _ =>
      }
    }
  }
}

3
这是对于 Scala 2.9.0.1 的一个 bug,还是代码出了问题呢?我分不清 Scala 和世界语,但我知道答案几乎总是“是你的代码有问题” :-) - paxdiablo
1
我尝试了这段代码(Windows 7 64位,64位JVM,Scala 2.9.0.1),并且出现了异常。 - Luigi Plinge
1
我可以使用更新的代码确认问题。我想我只需要让它运行多几次。不过,我没有一个好的解决方案给你。 - Ian McLaird
@Ian 目前的解决方案是使用旧版本的Scala。2.8.x 版本可以正常工作。 - Jus12
@Jus12 -- “医生,医生,当我这样做时很疼!” “那就别这样做!” - Michael Lorton
显示剩余4条评论
1个回答

3
这似乎是Actor框架中的一个bug。看起来你永远不应该得到一个RuntimeException。有关详细信息,请参见Scala Bug Tracker。它在2011年7月7日修复,可能正在等待发布。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接