gpt4 book ai didi

erlang - 在erlang receive语句中引入 'save queue'的目的是什么

转载 作者:行者123 更新时间:2023-12-02 03:26:19 25 4
gpt4 key购买 nike

我是 erlang 新手,正在学习 Joe Armstrong 的“Programming Erlang”教程。

我对8.6中选择性接收中提到的“保存队列”感到困惑。如果消息根本不匹配,为什么不直接丢弃呢?放回邮箱以便后续处理的目的是什么?如果这是默认行为,这些垃圾消息(意味着它们无法匹配)可能会导致性能损失,因为它们会累积而不释放。

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

请帮忙,我将不胜感激任何能证明这一点的代码片段,谢谢。

最佳答案

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

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

当一个接收 block 完成后,保存队列将按照原始接收顺序放回到邮箱中,因为下一个接收 block 有机会拥有与“保存排队”消息之一匹配的条目。

一种用途是管理优先级:

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()

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

你是对的,邮箱中存在意外消息累积的风险,尤其是在永无休止的循环中,这就是为什么你会经常看到像最后一行这样的内容

Other -> process_unexpected_message(Other)

清空邮箱。

关于erlang - 在erlang receive语句中引入 'save queue'的目的是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14747039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com