【问题标题】:Is there a clever way to give messages different priorities?有没有一种聪明的方法来给消息不同的优先级?
【发布时间】:2013-01-16 00:11:15
【问题描述】:

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

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

方法二:

我也尝试过使用中介类型的方法,首先将消息设置为“前台”,然后将消息发送到高队列或低队列,最后是'worker' 线程首先从高队列请求作业,如果该队列没有任何内容,则从低队列请求作业,如下所示:

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

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

【问题讨论】:

    标签: erlang


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了,这正是我想要的 :-)
    • “非重要”消息被阅读后是否接收简历?那么如果我现在没有什么重要的东西,它会在阅读完不重要的东西后继续等待重要的东西吗?
    • @Bula 迟到的评论,虽然我也想知道这一点。似乎您只需要在函数定义的末尾重复出现,即在最终的end 之后再次调用函数本身。见stackoverflow.com/a/12249846/1460448
    猜你喜欢
    • 2020-08-28
    • 1970-01-01
    • 2015-04-07
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多