1

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)
    } 
  }
}
4

1 に答える 1

0

あなたの質問に興味を持ったので、ソースをざっと見てみました...ここに私が見つけたものがあります:

select が返すものは、TCP 接続を処理するオブジェクトに依存するようです。この NetKernel は以前に作成されたプロキシを記憶しているため、「現在の Netkernel」が同じである限り、プロキシは同じです。現在の Netkernel は Actor.self の現在の値に依存しており、これは現在のスレッドにある可能性があります (詳しくは説明しませんでした)。私にとっては、r=a が p と i がそれとは異なる理由を説明しています。

p と i が異なる理由は、新しい NetKernel が alive(port) 呼び出しによってアクターに関連付けられているためだと思います (アクターのカーネルは、ランダムなポートではなく、指定されたポートを使用する必要があります)。

于 2011-04-01T08:51:55.090 に答える