RemoteActor.select - результат детерминированный? - PullRequest
1 голос
/ 21 июля 2010

Интересно, есть ли какой-нибудь детерминизм при вызове 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 Ответ

0 голосов
/ 01 апреля 2011

Ваш вопрос вызвал у меня любопытство, поэтому я быстро взглянул на источник ... вот что я нашел:

То, что возвращает select, похоже, зависит от объекта, который обрабатывает соединения TCP.Поскольку этот NetKernel запоминает ранее созданные прокси-серверы, прокси-серверы такие же, как и «текущий Netkernel».Текущее Netkernel зависит от текущего значения Actor.self, которое может (я не копал так глубоко) в текущем потоке.Для меня это объясняет, почему r = a, но p и i отличаются от этого.

Полагаю, причина различий между p и i заключается в том, что новый NetKernel ассоциируется с актором вызовом alive (port) (ядру актера необходимо использовать указанный порт, а не случайный).

...