我想知道在调用val delegate = 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 :(得分:0)
你的问题让我很好奇,所以我快速浏览了一下......这就是我发现的:
返回什么似乎取决于处理TCP连接的对象。由于此NetKernel会记住以前创建的代理,只要“当前Netkernel”相同,代理就是相同的。当前的Netkernel依赖于Actor.self的当前值,这可能(我没有深入挖掘)当前线程。对我来说,这解释了为什么r = a但是p和i不同。
我想,p和i不同的原因是,一个新的NetKernel通过alive(端口)调用与actor相关联(actor的内核需要使用指定的端口,而不是随机的端口)。