混合Actors和DaemonActors的奇怪/随机行为

时间:2011-03-30 23:53:05

标签: scala actor

这可能与之前的question有关,但我不太确定.......

我有一个基于Scala / Actor的子系统,它使用3个合作演员来完成一些工作。每个Actors实际上都是DaemonActor。外部消息被发送到主要Actor,偶尔消息从次要Actor发送到主要消息,要求它对从外部消息收集的数据进行处理。

我编写了一个测试驱动程序Scala程序,用于启动相关子系统,并使用DaemonActor将消息发送到子系统(即主要Actor)。

事实证明,发送到主Actor的消息是由主Actor处理的,但是从辅助子系统Actor发送到主Actor的消息未被处理。

我发现如果我在测试驱动程序中使用非Deamon Actor,而不是DaemonActor,那么一切都按预期工作。这是100%确定性的,因为当外部测试驱动程序使用Actor时,子系统总是表现出来。当外部测试驱动程序使用DaemonActor时,子系统总是出错。在Actors和DaemonActors之间切换时,代码没有进行任何其他更改。

事情变得更加奇怪,当我制作一个扩展的测试驱动程序,使用2个Actors将2种不同类型的消息发送到子系统时,我不得不让测试驱动程序的一个演员成为DaemonActor或接收消息的子系统乖。

似乎非常随意: - )

需要注意的一点需要注意:测试驱动程序actor实际上在子系统类上调用方法,该方法将方法调用“转换”为发送给主子系统actor的消息。这是为了与Java代码兼容。

我尝试了许多不同的方法来判断消息是否正在处理中。但是我做了它我需要程序中的一些信息,当它正在运行时,我决​​定打印出来的东西。因此,我提到了关于打印和刷新缓冲区的问题。似乎影响行为的唯一因素是Actor vs. DaemonActor。

我可以发送代码,但它会有很多。

任何见解都将受到赞赏!

2 个答案:

答案 0 :(得分:0)

一个可能的问题是你还没有开始演员吗?

答案 1 :(得分:0)

DaemonActor的工作流程究竟是什么,您使用的是Scala 2.7还是2.8?如果您将代码发布在gist或pastebin类型的系统上,我相信我们很多人都很乐意看到它。 :)

在2.8中,常规actor会阻止运行时在活动时终止;顾名思义,DaemonActors不会。如果您只是向DaemonActor发送一条或多条消息,然后程序结束,它甚至可能永远不会发送到其他Actors的消息。