2008-11-03 5 views
4

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

ответ

7

Вы не можете изменять порядок сообщений в очереди сообщений процесса в 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

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

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

1

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

Смежные вопросы