2010-07-21 5 views
1

Je me demande s'il existe un déterminisme lors de l'appel de val delegate = RemoteActor.select(). Je demande cela, parce que je remarqué que le programme ne se termine pas, quand j'envoyer des délégués sur le net.RemoteActor.select - résultat déterministe?

Y a-t-il d'autres effets secondaires qui dépendent du délégué?

Existe-t-il des règles, quand RemoteActor.select renvoie le même délégué pour les mêmes arguments?

Voici quelques exemples de code qui illustre le problème de 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) 
    } 
    } 
} 

Répondre

0

Votre question m'a fait curieux, donc j'ai eu un coup d'oeil à la source ... voici ce que je trouve:

Qu'est-ce que select returns semble dépendre d'un objet qui gère les connexions TCP. Comme NetKernel se souvient des proxies créés précédemment, les proxys sont les mêmes tant que le «Netkernel actuel» est le même. Le Netkernel actuel dépend de la valeur actuelle de Actor.self, qui pourrait (je n'ai pas creusé cette profondeur) sur le thread en cours. Pour moi, cela explique pourquoi r = a mais p et i sont différents de cela. Je suppose que la raison pour laquelle p et i sont différents est qu'un nouveau NetKernel est associé à l'acteur par l'appel vivant (port) (le noyau de l'acteur doit utiliser le port spécifié, et non un aléatoire).

Questions connexes