gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 01:22:27 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com