我是 Scala 的新手,我一直在网上学习 Programming Scala (O'Reilly);在这样做的同时,我对 Chapter 1, "A Taste Of Concurrency" 中 shapes-actor-script.scala
示例的结果感到惊讶。 .
具体来说,运行 scala -cp 的输出。 shapes-actor-script.scala
应该是:
Circle.draw: Circle(Point(0.0,0.0),1.0)
Rectangle.draw: Rectangle(Point(0.0,0.0),2.0,5.0)
Triangle.draw: Triangle(Point(0.0,0.0),Point(1.0,0.0),Point(0.0,1.0))
Error: Unknown message! 3.14159
exiting...
但大约有 10% 的时间,我根本没有输出,甚至更少,我只会得到第一行作为输出。由于 Actors 的工作方式,我对 Scala 的了解还不够多,不知道这是否正常,或者我的 Scala 安装(Arch Linux 上的 Scala 2.8.1)是否有问题。
Actor 能否像这样处理消息(可能是因为示例的编写方式)?或者还有其他我可能在这里遗漏的事情吗?
最佳答案
我相信 Scala REPL 在运行完脚本后正在使用 System.exit(...)。这将停止进程而不等待任何挥之不去的线程。
这意味着所有消息都将发送给 actor,但 actor 可能无法及时处理它们。
为了演示,您可以尝试将 Thread.sleep(1000) 添加到 shapes-actor.scala 中的每个案例:
case s: Shape => Thread.sleep(1000);s.draw()
case "exit" => Thread.sleep(1000);println("exiting..."); exit
case x: Any => Thread.sleep(1000);println("Error: Unknown message! " + x)
这可能会使脚本每次都失败(它在我的机器上)。如果您随后添加 Thread.sleep(5000)(提供 2 秒的松弛时间),它应该每次都会成功。
解决方案是使用不以 System.exit(...) 结尾的程序。
更新(想一想):
您还可以将 actor 设置为在退出时通知:
case "exit" => Thread.sleep(1000);println("exiting..."); this.synchronized { this.notify }; exit
...然后脚本可以等待通知:
ShapeDrawingActor.synchronized { ShapeDrawingActor.wait(10000) }
关于scala - Scala 中的 Actors 能否处理消息失败? (O'Reilly 的 Programming Scala 中的示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4809553/