RemoteActor 取消注册 actor

2024-02-19

我正在玩 RemoteActors。现在我想知道,如果我关闭 RemoteActor 会发生什么。 该 Actor 可通过 RemoteActor.alive 和 RemoteActor.register 来使用。 我找不到两者的逆:活着和注册。

如何正确关闭 RemoteActor?

Update

为了让它更明显,我做了一个“小”例子。以下两个程序都没有终止,JVM 继续运行。所有用户创建的 actor 和 main 都已完成。

package test

import scala.actors.{OutputChannel, AbstractActor, Actor} , Actor._
import scala.actors.remote.RemoteActor , RemoteActor._


object ActorTestA{
  def main(args :Array[String]) {
    RemoteActor.classLoader = getClass().getClassLoader()
    println("Start A")
    val a = new A().start
    println("Fin A")
  }
}

object ActorTestB{
  def main(args :Array[String]) {
    RemoteActor.classLoader = getClass().getClassLoader()
    println("Start B")
    val b = new B().start
    b !? 'start
    println("Fin B")
  }
}

case class M1(sendRef :AbstractActor, m2 :M2)
case class M2(v1:String, v2 :String, sendRef :AbstractActor)
case class M3(m2 :M2)

object A { val portToUse = 20000 }
class A extends Actor {
  alive(A.portToUse)
  register('A, this)
  val proxy = select(actors.remote.Node("localhost", A.portToUse), 'A)

  def act = { 
    loop { react {
      case M1(sendRef, m2) =>
        println("A receives M1")
        sendRef ! M3(m2)
        self ! 'exit
      case 'exit => 
        println("A exits")
        exit
      case any => println("Unknown Msg: "+any)
    } } 
  }
}


class B extends Actor {
  val portToUse = 20001 
  alive(portToUse)
  register('B, this)
  val proxy = select(actors.remote.Node("localhost", portToUse), 'B)

  var resultTo :OutputChannel[Any] = _
  def act = { 
    loop { react {
      case 'start => 
        println("B starts")
        val a = select(actors.remote.Node("localhost", A.portToUse), 'A)
        a ! M1(proxy, M2("some","val", proxy))
        resultTo = sender
      case M3(M2(v1,v2,sendRef))=>
        println("B receives M3")
        resultTo ! sendRef
        self ! 'exit
      case 'exit => 
        println("B exits")
        exit
      case any => println("Unknown Msg: "+any)
    } } 
  }
}

A 的输出为:

Start A
Fin A
A receives M1
A exits

对于 B 来说是:

Start B
B starts
B receives M3
B exits
Fin B

调试器表示对于 A 程序,以下 4 个非守护线程仍然处于运行状态:

  • PlainSocketImpl.socketAccept
  • SocketInputStream.socketRead0
  • ForkJoinScheduler.liftedTree1
  • 销毁JavaVM

Is Actor http://www.scala-lang.org/docu/files/api/scala/actors/Actor.html.链接和Actor http://www.scala-lang.org/docu/files/api/scala/actors/Actor.html.trapExit 您在寻找什么?

EDIT尝试这个。我将所有内容都转移到了 act 方法中。在远程参与者之间发送代理似乎也会引起问题。这里有一些关于这个可能的错误的讨论:http://www.scala-lang.org/node/6779 http://www.scala-lang.org/node/6779;参见斯蒂芬·库恩的评论。

package test

import scala.actors.{OutputChannel, AbstractActor, Exit, Debug, Actor} , Actor._
import scala.actors.remote.RemoteActor , RemoteActor._


object ActorTestA{
  def main(args :Array[String]) {
    println("Start A")
    val a = new A().start
    println("Fin A")
  }
}

object ActorTestB{
  def main(args :Array[String]) {
    println("Start B")
    val b = new B().start
    b ! 'start
    println("Fin B")
  }
}

case class AA(hostname: String, port: Int, symbol: Symbol) {
  def proxy = select(actors.remote.Node(hostname, port), symbol)
}
case class M1(sendRef :AA, m2 :M2)
case class M2(v1:String, v2 :String, sendRef :AA)
case class M3(m2 :M2)

object A { val portToUse = 20000 }
class A extends Actor {
  def act = { 
    alive(A.portToUse)
    register('A, this)
    RemoteActor.classLoader = getClass().getClassLoader()
    val proxy = select(actors.remote.Node("localhost", A.portToUse), 'A)

    loop { react {
      case M1(sendRef, m2) =>
        println("A receives M1")
        sendRef.proxy ! M3(m2)
        self ! 'exit
      case 'exit => 
        println("A exits")
        exit
      case any => println("Unknown Msg: "+any)
    } } 
  }
}


class B extends Actor {
  def act = { 
    RemoteActor.classLoader = getClass().getClassLoader()
    val portToUse = 20001 
    alive(portToUse)
    register('B, this)
    var proxy = AA("localhost", portToUse, 'B)
    var resultTo :Option[OutputChannel[Any]] = None

    loop { react {
      case 'start => 
        println("B starts")
        val a = select(actors.remote.Node("localhost", A.portToUse), 'A)
        a ! M1(proxy, M2("some","val", proxy))
        resultTo = Some(sender)
      case M3(M2(v1,v2,sendRef))=>
        println("B receives M3") 
        resultTo match {  
          case Some(ch) => ch ! sendRef.proxy;  
          case None => println("ch missing!?")
        }
        self ! 'exit 
      case 'exit => 
        println("B exits")
        exit
      case any => println("Unknown Msg: "+any)
    } } 
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RemoteActor 取消注册 actor 的相关文章

  • Scala:获取 Map.head 元素的键(和值)

    让我们想象一下以下不可变的 Map val foo Map 10 ten 100 one hundred 我想获得第一个元素的密钥 foo head获取第一个元素 但接下来呢 我还想要这个元素的值 即 十 设置键 值对 val key va
  • 如何在Scala中实现尾递归快速排序

    我写了一个递归版本 def quickSort T xs List T p T T gt Boolean List T xs match case Nil gt Nil case gt val x xs head val left righ
  • 用于真实 Web 项目的 Scala-JS [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人用过吗Scala JS在真实的网络项目中 但不仅仅适用于普通的JavaScript在隔离环境中替换 我想尽可能多地使用 Scala 我希望可
  • Spark Scala:按小时或分钟计算两列的 DateDiff

    我在数据框中有两个时间戳列 我想获取它们的分钟差异 或者小时差异 目前我可以通过四舍五入获得日差 val df2 df1 withColumn time datediff df1 ts1 df1 ts2 但是 当我查看文档页面时https
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • Spark:替换嵌套列中的空值

    我想更换所有n a以下数据框中的值unknown 它可以是scalar or complex nested column 如果它是一个StructField column我可以循环遍历列并替换n a using WithColumn 但我希
  • Scala repl 抛出错误

    当我打字时scala在终端上启动 repl 它会抛出此错误 scala gt init error error while loading AnnotatedElement class file usr lib jvm java 8 ora
  • 如何从spark管道逻辑模型中提取变量权重?

    我目前正在尝试学习 Spark Pipeline Spark 1 6 0 我将数据集 训练和测试 导入为 oas sql DataFrame 对象 执行以下代码后 生成的模型是oas ml tuning CrossValidatorMode
  • 如何设计具有相互依赖的测试的 Specs2 数据库测试?

    有没有一些首选的方法来设计Specs2 http etorreborre github com specs2 测试 有很多测试取决于之前测试的结果 下面 您将找到我当前的测试套件 我不喜欢var位于测试片段之间 不过 它们是 需要的 因为某
  • 用惯用的 Scala 更新大型数据结构

    我已经尝试 Scala 一段时间了 并且经常遇到支持不可变数据结构的建议 但是当你有一个像这样的数据结构时3D 场景图 大型神经网络或任何具有大量需要频繁更新的对象的东西 对场景中的对象进行动画处理 训练神经网络 这似乎是 运行时效率极低
  • 减少/折叠幺半群列表,但减少器返回任一

    我发现自己遇到过几次这样的情况 我有一个减速器 组合 fn 如下所示 def combiner a String b String Either String String a b asRight String 它是一个虚拟实现 但 fn
  • 为什么 Scala 中的隐式类必须驻留在另一个特征/类/对象中?

    基于scala文档 http docs scala lang org overviews core implicit classes html http docs scala lang org overviews core implicit
  • Spark SQL 失败,因为“常量池已超过 JVM 限制 0xFFFF”

    我在 EMR 4 6 0 Spark 1 6 1 上运行此代码 val sqlContext SQLContext getOrCreate sc val inputRDD sqlContext read json input try inp
  • 从 HList 获取元素

    我尝试了 HList 并按预期进行了以下工作 val hl 1 foo HNil val i Int hl 0 val s String hl 1 但是 我无法让以下代码正常工作 让我们暂时假设对列表进行随机访问是一个聪明的主意 class
  • 高效序列化案例类

    对于我正在工作的图书馆 我需要提供一个高效 便捷 typesafe序列化 scala 类的方法 理想的情况是用户可以创建一个案例类 并且只要所有成员都是可序列化的 它似乎也应该如此 我准确地知道序列化和反序列化阶段的类型 因此不需要 也不能
  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • Spark:如何使用crossJoin

    我有两个数据框 df1有 100000 行并且df2有 10000 行 我想创建一个df3这是两者的交叉连接 val df3 df1 crossJoin df2 这将产生 10 亿行 尝试在本地运行它 但似乎需要很长时间 您认为本地可以实现
  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • scala中的反引号有什么用[重复]

    这个问题在这里已经有答案了 我在一本书上找到了以下代码 val list List 5 4 3 2 1 val result 0 list running total next element running total next elem

随机推荐