Scala ограничение размера почтового ящика
Можно ли установить максимальный размер для почтового ящика актера в Scala?
Возьмите проблему "Продюсер-потребитель". С потоками я могу блокировать производителей, когда буфер заполняется. Я видел пару примеров производителей-потребителей, написанных в Scala, и все они используют актеров с почтовыми ящиками, используемыми в качестве "буфера". Могу ли я установить размер почтового ящика, чтобы заставить производителей ждать, пока потребитель будет готов? Любое другое элегантное решение для предотвращения неконтролируемого роста почтовых ящиков?
Ответы
Ответ 1
Вы можете создать актера, который действует как буфер между производителем и потребителем. Буфер проверяет свой почтовый ящик на его данные цикла. Он отправляет сообщение "перегрузка" производителю, когда количество буферизованных продуктов слишком велико; и отправляет сообщение "ясно", как только все возвращается в порядок. В случае слишком большого количества сообщений он просто бросает входящие (или самые старые).
Пользователь активно запрашивает продукты из буфера, который, в свою очередь, отправляет обратно один продукт. Если буфер пуст, потребитель продолжает ждать ввода.
Производитель отправляет продукты в буферный актер. Если он получает сообщение "перегрузка", он может прекратить производство или продолжать работать, зная, что продукты могут быть сброшены.
Конечно, эта логика может быть непосредственно реализована самим производителем или потребителем, но отдельный буфер позволит вам легче вводить несколько производителей и/или потребителей.
Ответ 2
Метод Actor.mailboxSize
возвращает количество ожидающих сообщений в почтовом ящике Actor.
Это может использоваться для дросселирования производителя различными способами.
Например, может быть одна возможность,
Производитель проверяет, превышает ли потребитель mailboxSize
некоторый порог. Если это так, то он отправляет пользователю SpecialMessage
потребителю и блокирует семафор. Когда потребитель получает этот SpecialMessage
, он освобождает семафор. Теперь производитель может весело продолжать бизнес.
Это позволяет избежать опроса, а также всех отброшенных сообщений.