Erlang:优先接收

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页)不应该是:很多正常队列末尾的消息是否有优先级消息?

Chu*_*uck 5

Erlang是一种彻底的并发语言,没有理由你不能在同一时间发送几条消息.按照"哦,这很快 - 其他线程不太可能在那么短的时间内做出冲突的事情"的假设基本上与关闭你的眼睛并且说"没有比赛条件这样的事情,那就是没有竞争条件......"

  • 别忘了点击红宝石拖鞋. (4认同)

Ale*_*nov 5

On (1):是否可以做出这种假设取决于您的具体情况。例如,所有其他进程在向您发送消息之前可能一直在等待某事发生。

On (2):事实上,在我看来,最坏的情况是没有优先消息,因为每次都必须遍历邮箱:“有优先消息进来了吗?”