Можно ли построить рабочие очереди в Erlang? - PullRequest
4 голосов
/ 03 ноября 2008

Я видел много примеров чата в Erlang, но как насчет списков, таких как рабочая очередь? Если я хочу создать систему рабочей очереди, например систему управления проектами, можно ли переупорядочить сообщения в почтовом ящике процесса или мне нужно использовать приоритеты сообщений? Есть ли примеры систем рабочих процессов, построенных в Erlang?

Ответы [ 3 ]

7 голосов
/ 03 ноября 2008

Вы не можете переупорядочивать сообщения в очередях сообщений процесса в Erlang.

Вы можете, однако, делать выборочные приемы, в которых вы можете получить сообщение, которое вы считаете первым наиболее важным. Это не совсем то же самое, но работает для большинства целей.

Вот пример:

receive
    {important, Msg} ->
        handle(Msg)
after 0 ->
    ok
end,
receive
    OtherMsg ->
        handle(Msg)
end

Отличается от:

receive
    {important, Msg} ->
        handle(Msg);
    OtherMsg ->
        handle(Msg)
end

В этом случае он всегда сканирует всю очередь сообщений на наличие {important, Msg}, прежде чем продолжить обработку остальных сообщений. Это означает, что такие сообщения всегда будут обрабатываться раньше других, если они существуют. Это, конечно, требует некоторой производительности (на сканирование всей очереди уходит больше времени).

1 голос
/ 13 ноября 2008

Если вам нужно изменить порядок сообщений, вы можете следовать шаблону привратника: преобразовать почтовый ящик в отдельный процесс. Когда ваш исходный процесс готов к другому сообщению, привратник может вычислить, какое сообщение переслать, по любому выбранному вами правилу.

1 голос
/ 13 ноября 2008

Почтовые ящики процессов работают достаточно хорошо, как и для очередей заданий.

Просто добавьте в свои сообщения достаточно информации, чтобы выборочные шаблоны приема можно было легко писать, и вам не нужно будет переупорядочивать содержимое почтового ящика.

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