在Scala Actor中进行空闲处理的最简单方法是什么?

HRJ*_*HRJ 2 scala actor

我有一个scala actor,只要客户端请求它就能完成一些工作.当且仅当没有客户端处于活动状态时,我希望Actor进行一些后台处理.

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

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

  2. Actor类有一个reactWithin方法,可以用来从actor本身超时.但是文档说该方法没有返回.所以,我不知道如何使用它.

编辑; 澄清:

假设后台任务可以分解为可以独立处理的较小单元.

Ale*_*rov 6

好的,我知道我需要花2美分.根据作者的回答,我认为"优先接收"技术正是这里所需要的.可以在" Erlang:SO优先接收问题 "中找到讨论.我们的想法是首先接受高优先级消息,并且只在没有高优先级消息的情况下接受其他消息.

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

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

其工作原理如下.actor有一个带消息的邮箱(队列).的receive(或receiveWithin)参数是一个局部函数和演员库查找邮箱中的消息,其可以应用到该部分的功能.在我们的例子中,它只是一个目标HighPriorityMessage.因此,如果Actor库找到这样的消息,它将应用我们的部分函数,​​并且我们正在处理高优先级的消息.否则,reactWithin使用timeout 0调用带有参数的部分函数,TIMEOUT我们会立即尝试处理来自队列的任何可能的消息(因为它等待消息我们不能排除可能的消息HighPriorityMessage).