【问题标题】:RemoteActor.select - result deterministic?RemoteActor.select - 结果确定性?
【发布时间】:2011-03-19 02:11:51
【问题描述】:

我想知道调用 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)
    } 
  }
}

【问题讨论】:

    标签: scala scala-2.8 actor remote-actors


    【解决方案1】:

    你的问题让我很好奇,所以我快速浏览了一下来源......这是我发现的:

    select 返回的内容似乎取决于处理 TCP 连接的对象。由于此 NetKernel 会记住以前创建的代理,因此只要“当前 Netkernel”相同,这些代理就相同。当前的 Netkernel 取决于 Actor.self 的当前值,这可能(我没有深入挖掘)在当前线程上。对我来说,这解释了为什么 r=a 但 p 和 i 与此不同。

    我猜,p 和 i 不同的原因是新的 NetKernel 通过 alive(port) 调用与 actor 相关联(actor 的内核需要使用指定的端口,而不是随机端口)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多