현재 스칼라와 함께 사용되는 로깅 메커니즘에 대해 작업하고 있습니다 만, 실제로 작업하지 못하게하는 예기치 않은 문제가 발생했습니다. 기능을 테스트하기 위해 간단한 메시지 전달 링을 설정하려고합니다. 링 내에서 각 노드는 스칼라 액터의 확장이며 직계 이웃 (이전/다음)임을 인식합니다.Scala 액터의 로컬 변수로의 의도하지 않은 변경
링 구성은 제어기 액터로부터 전달 된 파라미터와, "노드"는 다음과 같이 수행된다 :
이 I가하고자하는대로 정확한 쌍을 수신하는 각 노드와 함께 작동하도록 나타나는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)
모두가 I 메시지를 소개 할 때 시점 그러나, (노드 0)에서 링 주위 전달됨을 통해 괜찮은 모든 노드가 이제 ringNeighbors 배열에 동일한 값을 가짐을 발견했습니다. 이 값은 ringBuilder (즉 노드 8의 이웃) 함수에서 루프의 최종 반복과 일치합니다. 추가적인 메시지 전달이 발생하지 않기 때문에 노드 배열과 링에서 각 인스턴스에 대해 이러한 값이 어떻게 수정되었는지 이해할 수 없습니다.
아직 스칼라 로프를 배우고 있으며 실수로 간단한 것을 간과하지 않기를 바랍니다.
자세한 설명을 가져 주셔서 감사합니다. 이 방법을 사용하여 불일치 문제를 해결하는지 확인합니다. 그것은 분명히 동시성 문제 인 것 같아서 해결하기가 상당히 불편한 것으로 판명되었지만 당신의 설명은 내가 전에 없었던 방향을 분명히 제공합니다. –
public 메서드를 public으로 만들면 다른 사람 (또는 다른 코드)이 액터 모델 캡슐화를 중단하도록 초대하기 때문에 scala.actors.Actor에서'act'를 제외한 모든 것을 고려하십시오. –
@RolandKuhn - 관측에 감사드립니다! 얼마나 당혹 스럽습니까, 캡슐화에 관한이 모든 이야기와 나는 변경할 수있는 필드를 공개했습니다 :) –