scala - Scala 中的 Actors 能否处理消息失败? (O'Reilly 的 Programming Scala 中的示例)

标签 scala actor

我是 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/

相关文章:

scala - 获取或创建子 Akka actor 并确保 liveness

scala - akka 将任务拆分为更小的结果并折叠结果

scala - Spark Dataframe - 显示每列的空行数

scala - 在 scala 测试模块中使用 gradle 运行特定测试

scala - Scala 中的并行文件处理

scala - 如何使用Scala actor充分利用所有核心?

java - Java/Groovy 中的重试响应式事件处理

scala - 使用字段覆盖无参数方法时出现空指针异常

scala - 如何在scala中将数字拆分为数字

scala - 让 Akka-2 实例每 n 个时间单位向自己发送一条消息,而不会溢出邮箱