【问题标题】:How to terminate Scala Remote Actor client?如何终止 Scala Remote Actor 客户端?
【发布时间】:2011-04-17 06:55:09
【问题描述】:

我正在使用 Remote Actors,但我遇到了一些困难。

考虑这个服务器:

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!"
    }
}

正如预期的那样,服务器打印“嘿!”。

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

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

如何终止客户端应用程序?还有更多:如果我希望我的客户端能够启动和停止连接怎么办?我怎样才能做到这一点?

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

谢谢!

【问题讨论】:

标签: scala actor remote-actors


【解决方案1】:

不要从演员之外向其他演员发送消息。虽然 Scala 很乐意接受它,但它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】:

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

    【讨论】:

      【解决方案3】:

      以下代码适用于我:

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

      【讨论】:

      • 是的,这会起作用,但它闻起来并不好闻。如果这是唯一的解决方案,那么要结束客户端创建的线程,我们需要终止整个应用程序...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 2020-06-21
      相关资源
      最近更新 更多