gpt4 book ai didi

Scala Actor 与非 Actor 的交互(或从 Actor 到 servlet 的同步消息)

转载 作者:行者123 更新时间:2023-12-04 06:48:55 27 4
gpt4 key购买 nike

我有以下 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 的更优雅的方法是什么? ?我想我必须使用 future ,但我无法理解这个概念。我需要确保每个 HTTP 请求都得到一个唯一的随机数(当然,随机数只是为了说明问题)。一些提示或引用将不胜感激。

最佳答案

要么使用:

!! <-- 返回一个你可以等待的 Future

或者

!? <-- 使用超时的,完全同步是危险的

鉴于您对 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

关于Scala Actor 与非 Actor 的交互(或从 Actor 到 servlet 的同步消息),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3397991/

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