gpt4 book ai didi

scala - 是否可以在 Actor 中使用 Akka 调度程序?

转载 作者:行者123 更新时间:2023-12-02 20:52:15 25 4
gpt4 key购买 nike

我希望能够让 Actor 睡一会儿。 Actor 们应该自己决定睡多久。由于 Thread.sleep() 不是推荐的方法,因此我考虑使用 akka 中的调度程序。因此,我定义了一个 Actor ,另一个 Actor 可以注册被唤醒。

class Scheduler extends Actor {

def receive = {
case Sleep(duration) => context.system.scheduler.scheduleOnce(duration) {
sender ! Ring
}
}
}

但是发送方永远不会收到 Ring 消息。所以我的问题是

  • 是否建议在 Actor 内部使用调度程序进行调度?
  • 为什么发送 Actor 从未收到 Ring 消息?
  • 如果不可能,推荐的解决问题的方法是什么?

最佳答案

首先让我回答标题问题:是的,可以在 Actor 内部使用调度程序。

case Sleep(duration) =>
context.system.scheduler.scheduleOnce(duration, self, Ring)

现在讨论问题背后的问题

你没有说出你真正想要实现的目标,所以我在这里做出一个有根据的猜测,你希望 Actor (通常会做一些叫做“X”的事情)暂时做一些叫做“Y”的事情,暂停“X”事件。完整的解决方案是

class Sleepy extends Actor {
def receive = {

... // cases doing “X”

case Sleep(duration) =>
case object WakeUp
context.system.scheduler.scheduleOnce(duration, self, WakeUp)
context.become({
case WakeUp => context.unbecome()
// drop the rest
}, discardOld = false)
}
}

同样可以使用 FSM 特性并在正常状态和 sleep 状态之间切换来实现。当然,您可以在 sleep 时做任何您想做的事情,例如混合 Akka 2.1 中的 Stash 特征,并在 sleep 时调用 stash() 处理所有(或部分)消息,在获取消息时调用 unstashAll() 唤醒消息;或者你可以干脆做点别的事。 Actor 非常灵活。

Actor 不做什么

Actor 从不真正 sleep ,他们总是处理传入的消息。如上所示,您可以定义这意味着什么,但基本原则是您不能挂起一个 Actor,使其不处理其邮箱中的消息。

关于scala - 是否可以在 Actor 中使用 Akka 调度程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13896638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com