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) 然后,您的目标演员将只需要实施适当的响应循环来处理给定的消息。没有必要让任何演员睡觉。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |