RemoteActor.select - результат детерминированный?
Интересно, есть ли какой-нибудь детерминизм при вызове 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)
}
}
}
1 ответ
Ваш вопрос вызвал у меня любопытство, поэтому я быстро взглянул на источник... вот что я нашел:
То, что возвращает select, похоже, зависит от объекта, который обрабатывает TCP-соединения. Поскольку этот NetKernel запоминает ранее созданные прокси-серверы, прокси-серверы такие же, как и "текущий Netkernel". Текущее Netkernel зависит от текущего значения Actor.self, которое может (я не копал так глубоко) в текущем потоке. Для меня это объясняет, почему r = a, но p и i отличаются от этого.
Я предполагаю, что причина различий между p и i заключается в том, что новый NetKernel ассоциируется с актором с помощью вызова alive (port) (ядру актера необходимо использовать указанный порт, а не случайный).