加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 睡觉演员?

发布时间:2020-12-16 09:30:37 所属栏目:安全 来源:网络整理
导读:让演员睡觉的最好方式是什么?我将演员设置为希望维护数据库不同部分的代理(包括从外部来源获取数据)。由于一些原因(包括不会重载数据库或通信和一般负载问题),我希望演员在每个操作之间进行睡眠。我正在看着像10个演员对象的东西。 演员将无限运行,因为总
让演员睡觉的最好方式是什么?我将演员设置为希望维护数据库不同部分的代理(包括从外部来源获取数据)。由于一些原因(包括不会重载数据库或通信和一般负载问题),我希望演员在每个操作之间进行睡眠。我正在看着像10个演员对象的东西。

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

我可以通过一个无限循环,并在每个循环结束的睡眠,但根据http://www.scala-lang.org/node/242演员使用一个线程池,扩展所有的线程被阻止。所以我想像一个Thread.sleep在每个演员将是一个坏主意,会浪费线程不必要的。

我可能会有一个中央演员自己的循环,在一个时钟(如异步事件时钟观察者)发送消息给订阅者?

有没有人做过类似的事情或有任何建议吗?对不起,额外(也许多余)的信息。

干杯

解决方法

没有必要明确地让演员睡觉:对每个actor使用循环和反应意味着底层线程池将具有等待线程,而没有任何消息可供actor处理。

在您要为演员计划事件进行处理的情况下,使用java.util.concurrent实用程序中的单线程调度程序很容易:

object Scheduler {
  import java.util.concurrent.Executors
  import scala.compat.Platform
  import java.util.concurrent.TimeUnit
  private lazy val sched = Executors.newSingleThreadScheduledExecutor();
  def schedule(f: => Unit,time: Long) {
    sched.schedule(new Runnable {
      def run = f
    },time,TimeUnit.MILLISECONDS);
  }
}

你可以延长这个周期性的任务,因此可以使用它们:

val execTime = //...  
Scheduler.schedule( { Actor.actor { target ! message }; () },execTime)

然后,您的目标演员将只需要实施适当的响应循环来处理给定的消息。没有必要让任何演员睡觉。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读