【问题标题】: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】:

    邮箱是一个队列 - 如果没有任何东西从队列中拉出消息(即,如果您的 reactreceive 循环中的部分函数为 isDefinedAt 返回 false),那么消息就留在那儿.

    严格来说,这是(您的应用程序的)内存泄漏,尽管它的严重性取决于这些未读消息的数量如何增长(显然)。例如,我经常使用演员来合并重播查询和消息的“实时流”,两者都由序列号标识。我的反应是这样的:

    var lastSeq = 0L
    loop {
      react {
        case Msg(seq, data) if seq > lastSeq => lastSeq = seq; process(data)
      }
    }
    

    这包含内存泄漏,但不是“严重”的,因为重复消息的数量会有一个上限(即,一旦重播查询完成,就不能再有了)。

    但是,这可能仍然是一个烦恼,对于每个反应,actor子系统都会再次扫描这些消息,看看它们是否可以被处理。

    事实上,考虑一个真实邮箱可能是一个很好的类比。想象一下,您将所有的垃圾邮件都留在了那里:很快,您将遭受饥饿的痛苦,因为您必须筛选所有垃圾邮件才能获得信用卡对帐单。 p>

    【讨论】:

      【解决方案2】:

      这种内存泄漏在其他语言中是如何解决的?例如在 Erlang 中?

      与 Scala 中的相同。第一期:

      1. 如果忘记实现特殊消息的响应案例

      您很少需要故意在邮箱中留言并稍后接收。我从来没有遇到过这样的情况。因此,您始终可以包含一个包罗万象的子句(Scala 中的case _ => ...),它不会执行任何操作、记录警告或抛出异常——只要在您的情况下最有意义。

      1. 如果消息来得太快

      不要将消息直接发送到处理速度不够快的进程,而是添加一个缓冲进程。它可以丢弃多余的消息,将它们发送到多个工作进程,等等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 2015-05-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多