2010-07-21 25 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(端口)調用(參與者的內核需要使用指定的端口,而不是隨機的)與參與者關聯。