我相信这些与这个主题有关的帖子有点旧了,有些事情已经改变了。 以这个答案为起点:“不要睡在演员里面!这将导致线程被阻塞,这正是你试图避免的--耗尽资源。 相反,如果你只是处理消息并“什么都不做”,Actor将不会占用任何调度资源,并且将只是堆上的另一个普通对象(占用大约一点内存,但没有其他内容)。How to put actor to sleep? 下面是一个示例,说明如何获得与Thread.sleep()相同的行为 里面的演员,你想使“睡眠”
private void rescheduleActor() {
// schedule to wake up
logger.debug("rescheduleActor: Sleeping for 15 seconds");
getContext().getSystem().scheduler().scheduleOnce(
Duration.ofMillis(15000),
getSelf(),
new WakeUp(), getContext().getSystem().dispatcher(), null);
}
@Override
public void onReceive(Object msg) {
if (msg instanceof WakeUp) {
logger.debug("rescheduleDistributionTrackEntry: Resuming process.");
methodToInvoke();
}
}
2条答案
按热度按时间uxh89sit1#
在Akka中不建议任何阻止线程的操作。如果Actor配置了一个共享线程池(默认行为),那么使用Thread.sleep将从该池中保留一个线程,该线程可能正在为其他Actor工作。
如果真的必须阻塞,则可以将参与者配置为具有其自己的线程。这可以通过配置一个自定义的调度器来完成,完整的细节是here。
公认的阻塞替代方案是通过计时器调度对actor的回调,例如在5秒后发送消息。
Akka调度程序的文档如下:http://doc.akka.io/docs/akka/2.3.6/scala/scheduler.html
zxlwwiss2#
我相信这些与这个主题有关的帖子有点旧了,有些事情已经改变了。
以这个答案为起点:“不要睡在演员里面!这将导致线程被阻塞,这正是你试图避免的--耗尽资源。
相反,如果你只是处理消息并“什么都不做”,Actor将不会占用任何调度资源,并且将只是堆上的另一个普通对象(占用大约一点内存,但没有其他内容)。How to put actor to sleep?
下面是一个示例,说明如何获得与
Thread.sleep()
相同的行为里面的演员,你想使“睡眠”
更多详情:https://doc.akka.io/docs/akka/2.5/scheduler.html