【问题标题】:Scala, Actors, what happens to unread inbox messages?Scala,Actors,未读收件箱消息会发生什么?
【发布时间】:2011-11-09 02:13:41
【问题描述】:
Scala Actors 中的未读 收件箱消息会发生什么?例如两种情况:
1.如果忘记对特殊消息执行react case:
actor!NoReactCaseMessage
2.如果消息来得太快:
(timeOfProcessingMessage > timeOfMessageComes)
如果发生第一种或第二种情况,它会堆积在内存中吗?
编辑 1 是否有任何机制可以看到这种类型的内存泄漏正在发生?也许,控制未读消息的数量然后进行一些垃圾收集或增加演员池。如何获取未读消息的数量?这种内存泄漏如何在其他语言中解决?例如在 Erlang 中?
【问题讨论】:
标签:
scala
functional-programming
erlang
actor
【解决方案1】:
邮箱是一个队列 - 如果没有任何东西从队列中拉出消息(即,如果您的 react 或 receive 循环中的部分函数为 isDefinedAt 返回 false),那么消息就留在那儿.
严格来说,这是(您的应用程序的)内存泄漏,尽管它的严重性取决于这些未读消息的数量如何增长(显然)。例如,我经常使用演员来合并重播查询和消息的“实时流”,两者都由序列号标识。我的反应是这样的:
var lastSeq = 0L
loop {
react {
case Msg(seq, data) if seq > lastSeq => lastSeq = seq; process(data)
}
}
这包含内存泄漏,但不是“严重”的,因为重复消息的数量会有一个上限(即,一旦重播查询完成,就不能再有了)。
但是,这可能仍然是一个烦恼,对于每个反应,actor子系统都会再次扫描这些消息,看看它们是否可以被处理。
事实上,考虑一个真实邮箱可能是一个很好的类比。想象一下,您将所有的垃圾邮件都留在了那里:很快,您将遭受饥饿的痛苦,因为您必须筛选所有垃圾邮件才能获得信用卡对帐单。 p>
【解决方案2】:
这种内存泄漏在其他语言中是如何解决的?例如在 Erlang 中?
与 Scala 中的相同。第一期:
- 如果忘记实现特殊消息的响应案例
您很少需要故意在邮箱中留言并稍后接收。我从来没有遇到过这样的情况。因此,您始终可以包含一个包罗万象的子句(Scala 中的case _ => ...),它不会执行任何操作、记录警告或抛出异常——只要在您的情况下最有意义。
- 如果消息来得太快
不要将消息直接发送到处理速度不够快的进程,而是添加一个缓冲进程。它可以丢弃多余的消息,将它们发送到多个工作进程,等等。