我是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(其他)
清空邮箱.