我一直在想,在与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:
我还尝试过一种中介类型的方法,首先将消息设置为“前台”,然后将“前台”发送到高级队列或低级队列,然后最后一个'worker'线程从firsk高队列请求作业,如果该队列什么都没有,那么从低队列开始,如下所示:
这有不得不等待请求到达不同队列前面的缺点,也许某种优先级系统可行: - )
有更聪明的方式做这样的事吗?
答案 0 :(得分: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之后”意味着如果邮箱中没有匹配(优先级)消息,则会立即发生超时。
我不知道有任何更聪明的方法:)