scala - 在 Scala Actor 中进行空闲处理的最简单方法?

标签 scala actor

我有一个 scala actor,它在客户请求时做一些工作。当且仅当没有客户端处于事件状态时,我希望 Actor 进行一些后台处理。

最简单的方法是什么?我可以想到两种方法:

  1. 生成一个超时的新线程并定期唤醒 actor。一种直接的方法,但我想避免创建另一个线程(以避免额外的代码、复杂性和开销)。

  2. Actor 类有一个 reactWithin 方法,可用于从 actor 本身超时。但是文档说该方法不会返回。所以,我不确定如何使用它。

编辑;澄清:

假设后台任务可以分解成更小的单元,可以独立处理。

最佳答案

好的,我知道我需要投入 2 美分。从作者的回答来看,我猜“优先接收”技术正是这里所需要的。可以在“Erlang: priority receive question here at SO”中找到讨论。这个想法是首先接受高优先级消息,只有在没有高优先级消息时才接受其他消息。

由于 Scala actors 与 Erlang 非常相似,实现它的简单代码如下所示:

def act = loop {
  reactWithin(0) {
    case msg: HighPriorityMessage => // process msg
    case TIMEOUT =>
      react {
        case msg: HighPriorityMessage => // process msg
        case msg: LowPriorityMessage => // process msg
      }
  }
}

其工作原理如下。 Actor 有一个带有消息的邮箱(队列)。 receive(或 receiveWithin)参数是一个偏函数,Actor 库在邮箱中查找可以应用于此偏函数的消息。在我们的例子中,它只是 HighPriorityMessage 的一个对象。因此,如果 Actor 库找到这样的消息,它会应用我们的部分功能,我们正在处理高优先级的消息。否则,超时为 0 的 reactWithin 使用参数 TIMEOUT 调用我们的部分函数,​​我们立即尝试处理队列中任何可能的消息(因为它等待消息,我们不能排除获得 HighPriorityMessage 的可能性。

关于scala - 在 Scala Actor 中进行空闲处理的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1560402/

相关文章:

scala - 从intellij运行scoverage

scala - Scala 2.9 和 Actors 中的并行集合

scala - 在 Scala Actor 中访问共享资源的正确方法

algorithm - Scala 中最快的加权随机算法?

scala - akka-remote 可序列化警告

java - 不要在父供应商参与者重新启动时重新启动处理参与者

java - future 完成后返回 Ajax 响应

f# - 如何在 F# Akka.NET Actor 中存储状态?

scala - 如何使JavaFX应用程序在Retina显示屏上不模糊

scala - 从 Map[String, Type] 生成案例类?