Scala 演员中的 Thread.sleep

问题描述 投票:0回答:2

在演员内部使用

Thread.sleep(5000);
是否正确?它真的能让演员睡 5 秒钟吗?有没有一种简单的替代方法可以让演员睡几秒钟?

scala concurrency actor
2个回答
30
投票

Akka 不建议任何阻塞线程的东西。如果 Actor 配置了一个共享线程池(默认行为),那么使用 Thread.sleep 将从该池中保留一个线程,该线程可能正在为其他 Actor 工作。

如果一个人真的必须阻塞,那么一个演员可能被配置为有自己的线程。这可以通过配置一个自定义调度程序供演员使用来完成,完整的细节是here.

公认的阻塞替代方法是通过计时器安排对参与者的回调,例如在 5 秒后发送消息..

akkaSystem.scheduler.scheduleOnce(5 seconds, actor, "msgFoo")

Akka 调度程序记录在这里:http://doc.akka.io/docs/akka/2.3.6/scala/scheduler.html


0
投票

我相信与这个主题相关的这些帖子有点旧,并且有些东西已经改变了。

以这个答案为出发点: “不要在 Actors 中使用 sleep()!那会导致线程被阻塞,导致您正试图避免的事情——耗尽资源。

相反,如果您只是处理消息而“什么都不做”,Actor 将不会用完任何调度资源,而只是堆上的另一个普通对象(占用一些内存但没有别的)。” 来自这篇文章:如何让演员入睡?

然后,这是一个示例,说明您可以采取哪些措施来获得与

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 onReceiveOriginalCallerNotification(Object msg) { 

   if (msg instanceof WakeUp) {
            logger.debug("rescheduleDistributionTrackEntry: Resuming process.");
            methodToInvoke();
        }

}

更多细节在这里:https://doc.akka.io/docs/akka/2.5/scheduler.html

© www.soinside.com 2019 - 2024. All rights reserved.