代码之家  ›  专栏  ›  技术社区  ›  Bruno Reis

如何终止Scala远程Actor客户端?

  •  4
  • Bruno Reis  · 技术社区  · 14 年前

    我在和远程演员玩,但我面临一些困难。

    object Server {
        def main(args: Array[String]) {
            val server = new Server
            server.start
        }
    }
    
    class Server extends Actor {
        RemoteActor.alive(12345)
        RemoteActor.register('server, this)
    
        def act() {
            while(true) {
                receive { case x => println(x) }
            }
        }
    }
    

    我写了一个简单的客户:

    object Client {
        def main(args: Array[String]) {
            val server = RemoteActor.select(Node("localhost", 12345), 'server)
            server ! "Hey!"
        }
    }
    

    正如所料,服务器打印“嘿!”。

    但是,出乎意料的是,客户端应用程序从未终止!

    看起来客户端应用程序上已经启动了许多线程,但它们在我的主功能完成后仍继续运行!

    一些附加信息(基于回复):我使用的是scala2.8.0.final,这里我要说的是一个独立的服务器和一个独立的客户机。它们应该像这样发射 $ scala Server $ scala Client . 我想要的是应用程序“Client”应该完成,但它永远不会发生。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Community CDub    7 年前

    不要从演员外部向其他演员发送消息。虽然斯卡拉会欣然接受,但它 has consequences

    import scala.actors.remote._
    
    object Act extends scala.actors.Actor {
      def act = {
            val server = RemoteActor.select(Node("localhost", 12345), 'server)
            server ! "Hey!"
      }
    }
    
    object Client {
        def main(args: Array[String]) {
          Act.start()
        }
    }
    

    或者,更简单地说,

    import scala.actors.Actor.actor
    import scala.actors.remote._
    
    object Client {
        def main(args: Array[String]) {
          actor {
            val server = RemoteActor.select(Node("localhost", 12345), 'server)
            server ! "Hey!"
          }        
        }
    }
    
        2
  •  1
  •   Kevin    14 年前

    在客户机代码中,将select和相关语句包装在演员,演员块,然后在块的末尾调用exit()。似乎不需要这样做,但这是我发现的唯一一种终止select调用启动的所有线程的方法。

        3
  •  0
  •   Jus12    14 年前

    import scala.actors.Actor
    import scala.actors.remote.RemoteActor
    import scala.actors.remote.RemoteActor._
    import scala.actors.remote.Node
    
    object Client {
        def main(args: Array[String]) {
            val server = RemoteActor.select(Node("localhost", 12345), 'server)
            server ! "Hey!"
            exit
        }
    }