2012-01-02 69 views
6

我一直在想,当与erlang进程交谈时,我希望能够分配不同的消息。有没有一种巧妙的方式来给消息提供不同的优先级?

我希望能够先处理高优先级的消息,然后再低优先级一次。

我已经尝试不同的方法,方法1:

loop() -> 
    receive 
     {high, Msg} -> 
      Do something with the message, 
      loop() 
     after 0 -> 
      ok 
    end, 
    receive 
     {low, Msg} -> 
      Do something with the message, 
      loop() 
     after 0 -> 
      loop() 
    end. 

这做工作,但它是安静的慢。我想接收者必须查看所有消息,看看每次运行时是否有“高”消息。

方法2:

我还试图做介体类型的方法,其中消息是第一组的“前台”的“前台”,然后发送该消息到任何高队列或低队列,然后最后一个“工人”线程请求的作业从firsk高队列,如果队列中有什么,然后从低队列,为ilustrated这里:

enter image description here

这不得不不得不等待请求到达不同队列前端的缺点,或许某种优先系统可以工作: - )

有没有更聪明的方式来做这样的事情?

回答

11

我觉得本文回答你的问题:

https://www.erlang-solutions.com/upload/docs/9/erlang11-nystrom.pdf

基本上你想有一个接收如下:

receive 
    {hi_priority, Msg} -> Msg 
after 0 -> 
    receive 
    Msg -> Msg 
    end 
end 

由于Erlang的文件说,“之后0”表示超时如果邮箱中没有匹配(优先)消息,则会立即发生。

我不知道这样做:)

+2

真棒,Fhat正是我一直在寻找:-) – 2012-01-02 10:25:20

+0

是否“非重要”的消息后,收到的简历得到读的任何更聪明的方式?所以,如果我现在没有什么重要的东西,它会在阅读非重要的东西之后继续等待重要的东西吗? – Bula 2015-09-14 19:35:31

相关问题