是否有一种聪明的方式来给予消息不同的优先级?

Mar*_*sen 6 erlang

我一直在想,在与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.
Run Code Online (Sandbox Code Playgroud)

这样做,但它很安静.我想接收必须查看所有消息,以查看每次运行时是否有"高"消息.

方法2:

我也试过做一个中介类型的方法,其中消息首先被设置为'前台''前台'然后将消息发送到高队列或低队列,然后最后是'工作'线程从firsk高级队列请求作业,如果该队列什么都没有,那么从低队列开始,如下所示:

在此输入图像描述

这有不得不等待请求到达不同队列前面的缺点,也许某种优先级系统会起作用:-)

做这样的事情有更聪明的方法吗?

小智 11

我认为这篇文章回答了你的问题:

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

基本上你想要收到如下:

receive
  {hi_priority, Msg} -> Msg
after 0 ->
  receive
    Msg -> Msg
  end
end
Run Code Online (Sandbox Code Playgroud)

正如Erlang的文档所说"0之后"意味着如果邮箱中没有匹配(优先级)消息,则会立即发生超时.

我不知道有任何更聪明的方法:)

  • 太棒了,Fhat就是我想要的:-) (2认同)