ограничение размера почтового ящика scala - PullRequest
15 голосов
/ 24 октября 2009

Можно ли установить максимальный размер почтового ящика актера в Scala?

Возьмите проблему Производитель-Потребитель. С потоками я могу заблокировать производителей, когда буфер заполнится. Я видел пару примеров «производитель-потребитель», написанных на Scala, и все они используют актеров с почтовыми ящиками, используемыми в качестве «буфера». Могу ли я установить размер почтового ящика, чтобы производители ожидали, пока потребитель не будет готов? Любое другое элегантное решение, чтобы избежать неконтролируемого роста почтовых ящиков?

Ответы [ 2 ]

16 голосов
/ 24 октября 2009

Вы можете создать актера, который действует как буфер между производителем и потребителем. Буфер проверяет свой почтовый ящик на свои данные цикла. Он отправляет обратно сообщение «перегрузки» производителю, когда число буферизованных продуктов слишком велико; и отправляет «чистое» сообщение, как только все возвращается в порядок. В случае слишком большого количества сообщений он просто отбрасывает входящие (или самые старые).

Потребитель активно запрашивает товары из буфера, который, в свою очередь, отправляет обратно один товар. Если буфер пуст, потребитель продолжает ждать ввода.

Производитель отправляет продукты в буфер субъекта. Если он получает сообщение «перегрузки», он может остановить производство или продолжить производство, зная тот факт, что продукты могут упасть.

Конечно, эта логика может быть непосредственно внедрена в самого производителя или потребителя, но отдельный буфер позволит вам более легко представить нескольких производителей и / или потребителей.

5 голосов
/ 25 октября 2009

Метод Actor.mailboxSize возвращает количество ожидающих сообщений в почтовом ящике актера.

Это может быть использовано для регулирования производства различными способами.

Например, одна возможность может быть,

Производитель проверяет, превышает ли mailboxSize потребителя какой-либо порог. Если это так, то он отправляет SpecialMessage потребителю и блокирует семафор. Когда потребитель получает это SpecialMessage, он освобождает семафор. Теперь продюсер может весело продолжать свое дело.

Это позволяет избежать опроса, а также любых пропущенных сообщений.

...