2010-07-21 4 views
1

val delegate = RemoteActor.select()를 호출 할 때 결정 성이 있는지 궁금합니다. 인터넷을 통해 대리인을 보낼 때 프로그램이 종료되지 않는 것을 알아 냈으므로이 질문을 던집니다.RemoteActor.select - 결과 결정적입니까?

대리인에 따라 다른 부작용이 있습니까?

RemoteActor.select가 동일한 인수에 대해 동일한 대리인을 반환 할 때 규칙이 있습니까? 여기

가 RemoteActor.select 문제를 보여줍니다 몇 가지 예제 코드입니다 : 나는 소스에 잠깐 모습을했다, 그래서

package test 

import scala.actors.Actor, Actor._ 
import scala.actors.remote._, RemoteActor._ 

object DelegateTest { 
    def main(args :Array[String]) { 
    val actor = new Actorlein("localhost", 63000, 'first) 
    actor ! 'eval 
    } 
} 

class Actorlein(val host: String, val port: Int, val symbol: Symbol) extends Actor { 
    val preProxy1 = select(node, symbol) 
    val preProxy2 = select(node, symbol) 

    val node = Node(host,port) 
    this.start 
    alive(port) 
    register(symbol, this) 

    val initProxy1 = select(node, symbol) 
    val initProxy2 = select(node, symbol) 

    override def act = { 
    val actProxy1 = select(node, symbol) 
    val actProxy2 = select(node, symbol) 
    react { 
     case 'eval => { 
     val reactProxy1 = select(node, symbol) 
     val reactProxy2 = select(node, symbol) 
     //all true 
     println("pProxy equal? "+(preProxy1 == preProxy2)) 
     println("iProxy equal? "+(initProxy1 == initProxy2)) 
     println("aProxy equal? "+(actProxy1 == actProxy2)) 
     println("rProxy equal? "+(reactProxy1 == reactProxy2)) 
     //all true() 
     println("i equal p? "+(initProxy1 == preProxy1)) //false 
     println("r equal p? "+(reactProxy1 == preProxy1))//false 
     println("a equal p? "+(actProxy1 == preProxy1)) //false 
     println("i equal a? "+(initProxy1 == actProxy1)) //false 
     println("r equal a? "+(reactProxy1 == actProxy1))//true 
     } 
     case any => println("Unkown Msg: "+any) 
    } 
    } 
} 

답변

0

귀하의 질문이 나를 호기심 얻었다을 ... 여기에 내가 무엇을 발견 :

무엇 선택 반환은 TCP 연결을 처리하는 객체에 의존하는 것처럼 보입니다. 이 NetKernel은 이전에 생성 된 프록시를 기억하기 때문에 "현재 Netkernel"이 동일하면 프록시가 동일합니다. 현재 Netkernel은 Actor.self의 현재 값에 따라 달라지며, 현재 스레드에서 (그 깊이를 파지 않았을 수도 있습니다.) 나를 위해 r = a이지만 p와 i가 다른 이유를 설명합니다.

p와 i가 다른 이유는 새로운 NetKernel이 alive (포트) 호출에 의해 액터와 연결된다는 것입니다 (액터의 커널은 임의의 포트가 아니라 지정된 포트를 사용해야합니다).