gpt4 book ai didi

scala - RemoteActor取消注册actor

转载 作者:行者123 更新时间:2023-12-02 04:15:03 24 4
gpt4 key购买 nike

我在玩RemoteActors。现在我想知道,如果我关闭RemoteActor,会发生什么情况。
该Actor可通过RemoteActor.alive和RemoteActor.register获得。
我找不到两者的反面:生存和注册。

如何正确关闭RemoteActor?

更新

为了更加明显,我举了一个“小”例子。以下2个程序均未终止,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.socket接受
  • SocketInputStream.socketRead0
  • ForkJoinScheduler.liftedTree1
  • 销毁JavaVM
  • 最佳答案

    您正在寻找Actor .link和Actor .trapExit吗?

    编辑尝试一下。我将所有内容都移到了act方法中。在远程角色之间发送代理似乎也会引起问题。这里有一些关于此可能错误的讨论:http://www.scala-lang.org/node/6779;请参阅Stefan Kuhn的评论。

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

    关于scala - RemoteActor取消注册actor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3264210/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com