gpt4 book ai didi

scala - 忽略除最后一条以外的所有 Scala Actor 消息

转载 作者:行者123 更新时间:2023-12-04 15:57:14 26 4
gpt4 key购买 nike

除了最后一条消息,我想忽略所有相同类型的消息:

def receive =  {
case Message(type:MessageType, data:Int) =>
// remove previous and get only last message of passed MessageType
}

例如当我发送:

actor ! Message(MessageType.RUN, 1)
actor ! Message(MessageType.RUN, 2)
actor ! Message(MessageType.FLY, 1)

那么我只想接收:

Message(MessageType.RUN, 2)
Message(MessageType.FLY, 1)

当然,如果它们发送速度非常快,或者 CPU 负载很高

最佳答案

您可以等待很短的时间,存储最近到达的消息,然后只处理那些最近的消息。这可以通过向自己发送消息和 scheduleOnce 来完成。请参阅 the Akka HowTo: Common Patterns, Scheduling Periodic Messages 下的第二个示例.您可以等到新消息到达,而不是在最后一个滴答结束时安排滴答。这是一个类似的例子:

case class ProcessThis(msg: Message)
case object ProcessNow

var onHold = Map.empty[MessageType, Message]
var timer: Option[Cancellable] = None

def receive = {
case msg @ Message(t, _) =>
onHold += t -> msg
if (timer.isEmpty) {
import context.dispatcher
timer = Some(context.system.scheduler.scheduleOnce(1 millis, self, ProcessNow))
}
case ProcessNow =>
timer foreach { _.cancel() }
timer = None
for (m <- onHold.values) self ! ProcessThis(m)
onHold = Map.empty
case ProcessThis(Message(t, data)) =>
// really process the message
}

传入的 Message 实际上不会立即处理,而是存储在 Map 中,该 Map 仅保留每个 MessageType 的最后一个。在 ProcessNow 打勾消息上,它们确实被处理了。

您可以更改等待的时间长度(在我的示例中设置为 1 毫秒)以在响应度(从消息到达到响应的时间长度)和效率(CPU 或其他已使用或占用的资源)之间取得平衡.

关于scala - 忽略除最后一条以外的所有 Scala Actor 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24558651/

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