当前位置: 首页 > 知识库问答 >
问题:

有可能在演员内部使用Akka调度程序吗?

柴阳云
2023-03-14

我想有可能让演员睡一会儿。演员们应该自己决定他们要睡多久。由于thread.sleep()不是一种推荐的方法,所以我想到在Akka中使用调度程序。因此,我定义一个actor是指另一个actor可以注册被唤醒。

class Scheduler extends Actor {

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

但发送方从未接收到振铃消息。所以我的问题是

  • 是否建议在执行元内部使用计划程序进行计划?
  • 发送方为什么从未收到振铃消息?
  • 如果不可能这样做,建议采用什么方法解决问题?

共有1个答案

陶树
2023-03-14

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

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

你没有说出你真正想要达到的目标,所以我在这里做了一个有根据的猜测,你希望演员--它通常会做一些叫“X”的事情--做一些叫“Y”的事情,暂时中止“X”activity。这一问题的全部解决办法

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特性并在正常和休眠状态之间切换来实现。当然,您可以在睡眠时做任何您想做的事情,例如,在Akka 2.1中混合stash特性,并在睡眠时为所有(或部分)消息调用stash(),在获得wakeup消息时调用unstashall();或者你可以做点别的什么。演员很灵活。

演员从不真正睡觉,他们总是处理传入的消息。如上所示,您可以定义这意味着什么,但基本原则是,您不能挂起一个执行元,这样它就不会处理其邮箱中的消息。

 类似资料:
  • 由于akka是一个构建actor模型的工具包,而actor模型是运行在JVM内部的对象,那么创建后的actor对象的可靠性有多高。考虑到让它崩溃的性质,除非像使用毒丸或JVM关闭一样显式地杀死它,否则JVM中actor对象的可靠性有多高,actor不是自己全部杀死的。

  • Akka的文件警告: 在actor内部使用未来的回调时,如onComplete、onSuccess和onFailure,您需要小心避免关闭包含actor的引用,即不要从回调中调用方法或访问封闭actor上的可变状态 在我看来,如果我能让想要访问可变状态的未来在同一调度程序上运行,该调度程序安排了处理actor消息的线程的相互排除,那么这个问题就可以避免。这可能吗?(为什么不呢? 提供的没有绑定到参

  • 我正在使用Scala/Akka编写一个TCP客户端服务器程序。服务器端的一些参与者需要处理来自客户端的TCP消息。我使用了(复制)代码,基本上解析接收到的TCP消息,在接收到分隔符时,消息被发送给其他人。 由于不止一个actor使用此逻辑,所以我在baseTCP actor中对其进行了抽象,并从该actor继承了其他actor。我想在这个基本actor中添加一些常见的代码,比如处理bound/co

  • 我很想知道调整大小,或者在本例中增加单个节点系统上的actor池中actor的数量是否真的会影响性能。 我有一个带超线程的四核系统。在任何给定的点上,系统可以运行8个线程。假设执行元执行的大多数操作都是CPU绑定的,那么将池中的执行元数量从20个增加到40个会有什么收获呢?

  • 我经常发现自己使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主角也应该停止自己。所以当时,我观察子角色并停止主角色context.children.is。 我经常使用这种模式,但因为我从未读过这方面的文章。我不确定,这是一个好主意还是失败的演员有问题。。。? 我已经读过Akka 2中的关机模式,但是这种方法在Java中似乎比我的解决方案更复杂? 以下是我针对具有两个子任务的主要参与者

  • 在Play 2.2中,我创建了GlobalActor制作类 我想将游戏框架升级到 2.5。Play.current在play 2.5中被弃用,所以我使用注入器修改了这个类,但注入器始终为Null。我需要如何使这门课在 Play 2.5 中工作?