我目前正在使用Scala使用的日志记录机制,但遇到了一个意外问题,导致无法正常工作。为了测试功能,我正在设置一个简单的消息传递环。在环内,每个节点都是Scala Actor的扩展,并且知道它是直接的邻居(上一个/下一个)。意外更改为Scala Actor的局部变量
该环结构是如下进行,用参数“节点”从控制器演员被传递:
def buildRing(nodes:Array[Actor]){
var spliceArr:Array[Actor] = new Array[Actor](2)
spliceArr(0) = nodes(nodes.length-1)
spliceArr(1) = nodes(1)
nodes(0) ! spliceArr
Thread.sleep(100)
spliceArr(0) = nodes(nodes.length-2)
spliceArr(1) = nodes(0)
nodes(nodes.length-1) ! spliceArr
Thread.sleep(100)
for(i <-1 to numNodes-2){
spliceArr(0) = nodes(i-1)
spliceArr(1) = nodes(i+1)
nodes(i) ! spliceArr
Thread.sleep(100)
}
}
这似乎用作我将它希望,每个节点接收的正确对的邻居。在节点类有大小2的阵列,其被设置为如下:
class node(locLogger:logger,nid:Int,boss:Actor) extends Actor{
val ringNeighbors:Array[Actor] = new Array[Actor](2)
def act{
locLogger.start
loop{
receive{
case n:Array[Actor] =>
ringNeighbors(0) = n(0)
ringNeighbors(1) = n(1)
一切是通过在点,然而,当我介绍的消息被环(从节点0)周围通过细,我发现现在每个节点在它的ringNeighbors数组中都有相同的值。这些值与ringBuilder中循环的最终迭代(即节点8的邻居)函数一致。没有额外的消息传递发生,所以我不明白这些值是如何针对节点数组中的每个实例进行修改的,也就是说如何修改这些值。
我还在学习Scala的绳索,希望我没有忽略一些简单的错误。
感谢您的详细解释。我将使用这种方法,看看它是否解决了不一致的问题。它看起来好像是一个并发问题,通常结果很难解决,但你的解释肯定给我提供了我以前没有的方向。 –
请考虑制作除scala.actors.Actor上的'act' private之外的所有内容,因为使方法公开邀请其他人(或其他代码)破坏actor模型封装。 –
@RolandKuhn - 感谢您的观察!多么令人尴尬,所有这些关于封装的讨论,我都把我的可变域公开了:) –