在erlang接收语句中引入"保存队列"的目的是什么

Rex*_*Rex 4 erlang

我是erlang的新手,并从Joe Armstrong的"Programming Erlang"开始教程.

我对8.6中选择性接收中提到的"保存队列"感到困惑.如果消息根本不匹配,为什么不直接删除它?将它放回邮箱以便以后处理的目的是什么?如果它是默认行为,那些垃圾消息(意味着它们无法匹配)可能会导致性能损失,因为它们会在不释放的情况下累积.

我想知道我是否误解了这一部分.我试图检查进程邮箱的内容以便更好地理解,但我无法做到.

请帮助,我将不胜感激任何证明有用的代码片段,谢谢.

Pas*_*cal 10

本书的这一段描述了一个接收集团所做的细节.不要忘记,可以通过一个进程按顺序处理多个接收块,因此一条与第一个接收块的任何条目都不匹配的消息将被放入保存队列(为了提高效率),因为:

  • 它永远不会匹配当前接收块的任何条目,
  • 只有当一个输入消息与一个条目匹配或超时结束时,才能保证当前接收块完成.

当完成一个接收块时,保存队列以原始接收顺序放回到邮箱中,因为下一个接收块有机会有一个与"保存排队"消息之一匹配的条目.

一种用法是管理优先级:

loop() ->
   ...
   receive
      {high_prio,Msg} -> process_priority_message(Msg)
   after 0
      ok  % no priority message
   end,

   receive
      {low_prio,Msg} -> process_normal_message(Msg);
      Other -> process_unexpected_message(Other)
   end,
   ...
   loop()
Run Code Online (Sandbox Code Playgroud)

此代码允许处理消息{high_prio,Msg},即使它不在消息队列中的第一个位置.

而你是对的,存在意外消息在邮箱中累积的风险,特别是在永无止境的循环中,这就是为什么你会经常看到类似最后一行的东西

其他 - > process_unexpected_message(其他)

清空邮箱.