【问题标题】:Scala actor to non-actor interaction (or synchronizing messages from an actor to a servlet)Scala 参与者与非参与者的交互(或将参与者的消息同步到 servlet)
【发布时间】:2011-03-24 19:16:02
【问题描述】:

我有以下 scala 代码:

  package dummy
  import javax.servlet.http.{HttpServlet,
    HttpServletRequest => HSReq, HttpServletResponse => HSResp}
  import scala.actors.Actor

  class DummyServlet extends HttpServlet {
    RNG.start
    override def doGet(req: HSReq, resp: HSResp) = {
      def message = <HTML><HEAD><TITLE>RandomNumber </TITLE></HEAD><BODY>
           Random number = {getRandom}</BODY></HTML>
      resp.getWriter().print(message)
      def getRandom: String = {var d = new DummyActor;d.start;d.getRandom}
    }
    class DummyActor extends Actor {
      var result = "0"
      def act = { RNG ! GetRandom
        react { case (r:Int) => result = r.toString }
      }
      def getRandom:String = {
        Thread.sleep(300)
        result
      }
    }
  }

  // below code is not modifiable. I am using it as a library
  case object GetRandom
  object RNG extends Actor {
    def act{loop{react{case GetRandom=>sender!scala.util.Random.nextInt}}}
  }

在上面的代码中,我必须使用thread.sleep来保证result有足够的时间更新,否则返回0。不使用thread.sleep 的更优雅的方法是什么?我想我必须使用期货,但我无法理解这个概念。我需要确保每个 HTTP 请求都获得一个唯一的随机数(当然,随机数只是为了说明问题)。一些提示或参考将不胜感激。

【问题讨论】:

    标签: scala servlets synchronization actor future


    【解决方案1】:

    任意使用:

    !!

    !?

    鉴于你对 RNG 的定义,这里有一些 REPL 代码来验证:

    scala> def foo = { println(RNG.!?(1000,GetRandom)) } 
    foo: Unit
    
    scala> foo
    Some(-1025916420)
    
    scala> foo
    Some(-1689041124)
    
    scala> foo
    Some(-1633665186)
    

    文档在这里:http://www.scala-lang.org/api/current/scala/actors/Actor.html

    【讨论】:

    • 这是个好主意,除了使用!要么 !?代替!在上面的代码中,我需要修改 RNG 对象(即在某处添加回复语句)。至少,我是这么理解的。但是,我不允许修改该对象。
    • 鉴于您对 RNG 的定义,它工作得很好: scala> def foo = { println(RNG.!?(1000,GetRandom)) } foo: Unit scala> foo Some(-1025916420) scala> foo Some(-1689041124) scala> foo Some(-1633665186)
    • 这很有趣。我读过接收演员(即RNG)必须使用reply(message)而不是使用sender ! message来响应!?才能工作。但是,它在我的代码中也以这种方式工作。这是预期的吗?感谢您的提示,顺便说一句。
    • 呸,我的 REPL 返回“无”
    • 欢迎使用 Scala 版本 2.10.1(Java HotSpot(TM) 64 位服务器 VM,Java 1.7.0_21)。键入表达式以对其进行评估。键入 :help 以获取更多信息。 scala> import scala.actors._ import scala.actors._ scala> case object GetRandom 定义模块 GetRandom scala> object RNG extends Actor { | def act { loop { react { case GetRandom => sender!scala.util.Random.nextInt } } } | } 定义模块 RNG scala> println(RNG.!?(1000,GetRandom)) 无 scala>
    猜你喜欢
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2015-12-28
    • 1970-01-01
    相关资源
    最近更新 更多