我一直在想,在与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.

这可以完成工作,但是速度很慢。我猜接收器必须仔细检查所有消息,以查看每次运行时是否有“高”消息。

方法二:

我还尝试了一种中介类型的方法,即先将消息设置为“前台”,然后再将“消息”发送到高优先级队列或低优先级队列,最后再将其发送给“工作人员”线程从高端队列请求作业,如果该队列没有任何内容,则从低端队列请求作业,如下所示:

这样做的缺点是必须等待请求到达不同队列的最前面,也许某种优先级系统可以工作:-)

有一种更聪明的方式来做这样的事情吗?

最佳答案

我认为本文回答了您的问题:

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以后”表示如果邮箱中没有匹配的(优先级)消息,则超时将立即发生。

我不知道有什么更聪明的方法:)

10-07 13:41
查看更多