Rab*_*ski 6 erlang priority-queue
Erlang中的优先接收可以很容易地实现如下:
prio() ->
receive
{priority, X} -> X
after 0 ->
receive
X -> X
end
end.
Run Code Online (Sandbox Code Playgroud)
我正在阅读一篇名为Priority Messaging made easy的论文,其中描述了以下问题:
[code]示例[上面]的主要问题是,我们没有考虑到当从内部阻塞接收恢复评估时,我们可能在邮箱中有多个消息.在最坏的情况下,除了第一个,可能是大量元素之外的所有元素都可以是优先级消息.在这种情况下,我们实际上已经完成了与我们打算做的完全相反的事情.
我不完全明白这一点.
问题(1):我假设一旦一条消息到达消息队列,内部阻塞接收将被"调用"(即恢复),对吗?假设在从内部阻塞接收恢复的短时间内,队列中已经有一大堆消息在等待,这是否现实?
问题(2):此外,最坏的情况被描述为具有一个正常消息和许多优先级消息的队列.由于首先根据队列中的第一条消息检查所有的receive子句,然后针对队列中的第二条消息,...(来源:本书,第69-70页)不应该是:很多正常队列末尾的消息是否有优先级消息?
Erlang是一种彻底的并发语言,没有理由你不能在同一时间发送几条消息.按照"哦,这很快 - 其他线程不太可能在那么短的时间内做出冲突的事情"的假设基本上与关闭你的眼睛并且说"没有比赛条件这样的事情,那就是没有竞争条件......"
On (1):是否可以做出这种假设取决于您的具体情况。例如,所有其他进程在向您发送消息之前可能一直在等待某事发生。
On (2):事实上,在我看来,最坏的情况是没有优先消息,因为每次都必须遍历邮箱:“有优先消息进来了吗?”