gpt4 book ai didi

scala - sleep 的 Actor ?

转载 作者:行者123 更新时间:2023-12-03 14:32:46 25 4
gpt4 key购买 nike

让 Actor sleep 的最佳方式是什么?我将参与者设置为想要维护数据库不同部分(包括从外部来源获取数据)的代理。出于多种原因(包括不使数据库或通信过载以及一般负载问题),我希望参与者在每次操作之间休眠。我正在查看类似 10 个 Actor 对象的东西。

Actor 将几乎无限地运行,因为总会有新数据进入,或者坐在一个表中等待传播到数据库的其他部分等。这个想法是让数据库在任何时候都尽可能完整及时。

我可以用无限循环来做到这一点,并在每个循环结束时 sleep ,但根据 http://www.scala-lang.org/node/242 Actor 使用一个线程池,只要所有线程都被阻塞,该线程池就会扩展。所以我想在每个参与者中使用 Thread.sleep 将是一个坏主意,因为会不必要地浪费线程。

我也许可以有一个带有自己循环的中央角色,可以在时钟上向订阅者发送消息(如异步事件时钟观察者)?

有没有人做过类似的事情或有什么建议?抱歉提供额外(可能是多余的)信息。

干杯

最佳答案

在第一个答案中对 Erlang 有一个好处,但它似乎消失了。您可以轻松地对 Scala Actor 执行相同的类似 Erlang 的技巧。例如。让我们创建一个不使用线程的调度程序:

import actors.{Actor,TIMEOUT}

def scheduler(time: Long)(f: => Unit) = {
def fixedRateLoop {
Actor.reactWithin(time) {
case TIMEOUT => f; fixedRateLoop
case 'stop =>
}
}
Actor.actor(fixedRateLoop)
}

让我们使用测试客户端 actor 来测试它(我在 Scala REPL 中做到了):
case class Ping(t: Long)

import Actor._
val test = actor { loop {
receiveWithin(3000) {
case Ping(t) => println(t/1000)
case TIMEOUT => println("TIMEOUT")
case 'stop => exit
}
} }

运行调度程序:
import compat.Platform.currentTime
val sched = scheduler(2000) { test ! Ping(currentTime) }

你会看到这样的东西
scala> 1249383399
1249383401
1249383403
1249383405
1249383407

这意味着我们的调度程序按预期每 2 秒发送一条消息。让我们停止调度程序:
sched ! 'stop

测试客户端将开始报告超时:
scala> TIMEOUT
TIMEOUT
TIMEOUT

也停止它:
test ! 'stop

关于scala - sleep 的 Actor ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1224342/

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