Thread.sleep inside Scala actors

wydwbb8l  于 2023-05-07  发布在  Scala
关注(0)|答案(2)|浏览(156)

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

uxh89sit

uxh89sit1#

在Akka中不建议任何阻止线程的操作。如果Actor配置了一个共享线程池(默认行为),那么使用Thread.sleep将从该池中保留一个线程,该线程可能正在为其他Actor工作。
如果真的必须阻塞,则可以将参与者配置为具有其自己的线程。这可以通过配置一个自定义的调度器来完成,完整的细节是here
公认的阻塞替代方案是通过计时器调度对actor的回调,例如在5秒后发送消息。

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

Akka调度程序的文档如下:http://doc.akka.io/docs/akka/2.3.6/scala/scheduler.html

zxlwwiss

zxlwwiss2#

我相信这些与这个主题有关的帖子有点旧了,有些事情已经改变了。
以这个答案为起点:“不要睡在演员里面!这将导致线程被阻塞,这正是你试图避免的--耗尽资源。
相反,如果你只是处理消息并“什么都不做”,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();
        }

}

更多详情:https://doc.akka.io/docs/akka/2.5/scheduler.html

相关问题