Хорошо, я вижу, что мне нужно поставить свои 2 цента. Из ответа автора, я полагаю, техника «получения приоритета» - именно то, что нужно здесь. Обсуждение можно найти в « Erlang: приоритетный вопрос получения здесь в SO ». Идея состоит в том, чтобы сначала принимать сообщения с высоким приоритетом и принимать другие сообщения только при отсутствии сообщений с высоким приоритетом.
Поскольку акторы Scala очень похожи на Эрланга, тривиальный код для реализации этого будет выглядеть так:
def act = loop {
reactWithin(0) {
case msg: HighPriorityMessage => // process msg
case TIMEOUT =>
react {
case msg: HighPriorityMessage => // process msg
case msg: LowPriorityMessage => // process msg
}
}
}
Это работает следующим образом. У актера есть почтовый ящик (очередь) с сообщениями. Аргумент receive
(или receiveWithin
) является частичной функцией, и библиотека Actor ищет в почтовом ящике сообщение, которое можно применить к этой частичной функции. В нашем случае это будет объект только HighPriorityMessage
. Таким образом, если библиотека Actor находит такое сообщение, она применяет нашу частичную функцию, и мы обрабатываем сообщение с высоким приоритетом. В противном случае reactWithin
с таймаутом 0 вызывает нашу частичную функцию с аргументом TIMEOUT
, и мы сразу же пытаемся обработать любое возможное сообщение из очереди (поскольку оно ожидает сообщения, мы не можем исключить возможность получения HighPriorityMessage
).