Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala,Actors,未读收件箱消息会发生什么情况?_Scala_Functional Programming_Erlang_Actor - Fatal编程技术网

Scala,Actors,未读收件箱消息会发生什么情况?

Scala,Actors,未读收件箱消息会发生什么情况?,scala,functional-programming,erlang,actor,Scala,Functional Programming,Erlang,Actor,Scala Actors中未读的收件箱消息会发生什么情况?例如两种情况:1.如果忘记为特殊消息实现react case:actor!无任何一条密码信息2。如果消息来的太快:(处理消息的时间>消息来的时间) 如果发生第一种或第二种情况,它会被堆叠在内存中吗 编辑1是否有任何机制可以看到发生这种类型的内存泄漏?也许,控制未读消息的数量,然后进行一些垃圾收集或增加参与者池。如何获取未读邮件的数量?这种内存泄漏在其他语言中是如何解决的?例如,在Erlang?中,邮箱是一个队列-如果没有任何东西从队列中提

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

1.如果忘记为特殊消息实现react case:

actor!无任何一条密码信息


2。如果消息来的太快:

(处理消息的时间>消息来的时间)


如果发生第一种或第二种情况,它会被堆叠在内存中吗


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

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

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

var lastSeq = 0L
loop {
  react {
    case Msg(seq, data) if seq > lastSeq => lastSeq = seq; process(data)
  }
}
这包含内存泄漏,但不是“严重”泄漏,因为重复消息的数量将有一个上限(即,一旦重播查询完成,就不能再出现)

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

事实上,考虑一个真正的邮箱可能是一个很好的类比。想象一下,你把所有的垃圾邮件都放在那里了:很快,你就要挨饿了,因为你必须筛选所有的垃圾邮件才能拿到信用卡账单

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

和Scala一样。第一期:

  • 如果忘记执行特殊消息的响应案例
  • 您很少需要在邮箱中有意地留下一条消息,然后再接收它。我从未遇到过这样的情况。因此,您可以始终在Scala中包含一个catch-all子句(
    case\u=>…
    ),它将不执行任何操作、记录警告或引发异常——只要在您的情况下最有意义

  • 如果消息传得太快
  • 与其直接将消息发送到处理速度不够快的进程,不如添加一个缓冲进程。它可以丢弃额外的消息,将它们发送到多个工作进程,等等