Есть ли умный способ придавать сообщениям разные приоритеты? - PullRequest
6 голосов
/ 02 января 2012

Я думал, что хотел бы иметь возможность назначать разные сообщения разным приоритетам при общении с процессом эрланга.

Я хотел бы иметь возможность сначала обрабатывать сообщения с высоким приоритетом, а затем один раз с низким приоритетом.

Я пробовал разные подходы, подход 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.

Это делает работу, но тихо медленно. Я полагаю, что получатель должен просмотреть все сообщения, чтобы увидеть, есть ли сообщение «high» при каждом запуске.

Подход 2:

Я также попытался использовать подход типа посредника, когда сообщение сначала было установлено на «передний стол», «передний стол», затем отправляло сообщение либо в верхнюю, либо в низкую очередь, а затем, наконец, Рабочий поток запросил задания у первой очереди высокой очереди, а если в этой очереди ничего нет, то из низкой очереди, как показано здесь:

enter image description here

У этого недостатка было необходимость ждать, пока запрос не попадет в начало разных очередей, возможно, сработала бы какая-то система приоритетов: -)

Есть ли более разумный способ сделать что-то подобное?

1 Ответ

11 голосов
/ 02 января 2012

Я думаю, что этот документ отвечает на ваш вопрос:

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

В основном выполучить запрос следующим образом:

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

Как сказано в документации Эрланга «после 0», это означает, что время ожидания наступит немедленно, если в почтовом ящике нет соответствующих (приоритетных) сообщений.

Я не знаю ни одного более разумного способа сделать это:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...