Я пришел с Java, где я бы отправил Runnable
s в ExecutorService
, поддерживаемый пулом потоков. В Java очень ясно, как устанавливать ограничения на размер пула потоков.
Я заинтересован в использовании актеров Scala, но мне неясно, как ограничить параллелизм.
Скажем гипотетически, что я создаю веб-сервис, который принимает "задания". Задание отправлено с POST
запросами, и я хочу, чтобы моя служба поставила его в очередь, а затем немедленно вернула 202 Accepted
- т.е. задания обрабатываются асинхронно.
Если я использую акторы для обработки заданий в очереди, как я могу ограничить число одновременных обрабатываемых заданий?
Я могу придумать несколько разных подходов к этому; Мне интересно, есть ли в сообществе лучшая практика или, по крайней мере, какие-то четко разработанные подходы, которые несколько стандартны в мире Scala.
Один из подходов, о которых я подумал, - это наличие одного актера-координатора, который управлял бы очередью заданий и субъектами обработки заданий; Я предполагаю, что он мог бы использовать простое поле int для отслеживания того, сколько заданий в настоящее время обрабатывается. Однако я уверен, что при таком подходе будут некоторые ошибки, такие как отслеживание ошибки при уменьшении числа. Вот почему мне интересно, предлагает ли Scala более простой или более инкапсулированный подход к этому.
Кстати, я пытался задать этот вопрос некоторое время назад , но я спросил его плохо.
Спасибо!