Scala,Actors,未读收件箱邮件会发生什么?

时间:2011-09-02 10:54:59

标签: scala functional-programming erlang actor

Scala Actors 中的未读收件箱邮件会发生什么?例如两种情况:

1.如果忘记对特殊信息实施反应案例:

actor!NoReactCaseMessage

2。如果邮件过快:
(timeOfProcessingMessage > timeOfMessageComes)

如果发生第一种或第二种情况,是否会堆积在记忆中?

编辑1 有没有机制可以看到这种类型的内存泄漏?也许,控制未读消息的数量然后进行一些垃圾收集或增加演员池。如何获取未读邮件的数量?这种内存泄漏如何在其他语言中解决?例如,在 Erlang

2 个答案:

答案 0 :(得分:8)

邮箱是一个队列 - 如果没有任何东西从队列中提取消息(即reactreceive循环中的部分函数返回false isDefinedAt ),然后消息就在那里。

严格来说,这是一个内存泄漏(你的应用程序),虽然它的严重性取决于这些未读消息的数量增长(显然)。例如,我经常使用actor来合并重放查询和由序列号标识的消息的“实时流”。我的反应如下:

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

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

然而,这可能仍然是一个烦恼,因为对于每个反应,演员子系统将再次扫描这些消息以查看它们是否可以被处理。

事实上,在这里考虑真实邮箱可能是一个很好的比喻。想象一下,你把所有的垃圾邮件留在那里:很快,你就会遭受饥饿,因为所有的垃圾邮件你都需要筛选才能获得信用卡对帐单。

答案 1 :(得分:3)

  

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

与Scala相同。第一期:

  
      
  1. 如果忘记为特殊消息实施反应案例
  2.   

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

  
      
  1. 如果邮件过快,
  2.   

不是将消息直接发送到无法足够快地处理它们的进程,而是添加缓冲进程。它可以丢弃额外的消息,将它们发送给多个工作进程等等。