我有一个scala actor,只要客户端请求它就能完成一些工作.当且仅当没有客户端处于活动状态时,我希望Actor进行一些后台处理.
最简单的方法是什么?我可以想到两种方法:
产生一个新的线程,超时并定期唤醒演员.一个直接的方法,但我想避免创建另一个线程(以避免额外的代码,复杂性和开销).
Actor类有一个reactWithin方法,可以用来从actor本身超时.但是文档说该方法没有返回.所以,我不知道如何使用它.
编辑; 澄清:
假设后台任务可以分解为可以独立处理的较小单元.
好的,我知道我需要花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).