Вы хотите посмотреть либо библиотеку актеров Scala, либо Akka. У Akka более чистый синтаксис, но любой из них поможет.
Похоже, вам нужно создать группу актеров, которые знают, как обрабатывать ваши задачи. Актером может быть любой класс с методом получения - из учебника Akka (http://doc.akkasource.org/tutorial-chat-server-scala):
class MyActor extends Actor {
def receive = {
case "test" => println("received test")
case _ => println("received unknown message")
}}
val myActor = Actor.actorOf[MyActor]
myActor.start
Вы захотите создать пул экземпляров актеров и отправлять им свои задания в виде сообщений. Вот сообщение о пуле актеров Akka, которое может быть полезным: http://vasilrem.com/blog/software-development/flexible-load-balancing-with-akka-in-scala/
В вашем случае может подойти по одному действующему субъекту на задачу (акторы очень легкие по сравнению с потоками, поэтому вы можете иметь их ОДНО в одной виртуальной машине), или вам может потребоваться более сложное распределение нагрузки между ними.
EDIT:
Используя приведенный выше пример актера, отправить ему сообщение так же просто, как это:
myActor ! "test"
Затем актер выводит «полученный тест» на стандартный вывод.
Сообщения могут быть любого типа, и в сочетании с сопоставлением с шаблоном Scala у вас есть мощный шаблон для создания гибких параллельных приложений.
В общем, актеры Akka будут «поступать правильно» с точки зрения совместного использования потоков, и для нужд ОП, я думаю, по умолчанию все в порядке. Но если вам нужно, вы можете установить диспетчер, который должен использовать актер, в один из нескольких типов:
* Thread-based
* Event-based
* Work-stealing
* HawtDispatch-based event-driven
Установить диспетчера для актера тривиально:
class MyActor extends Actor {
self.dispatcher = Dispatchers.newExecutorBasedEventDrivenDispatcher("thread-pool-dispatch")
.withNewThreadPoolWithBoundedBlockingQueue(100)
.setCorePoolSize(10)
.setMaxPoolSize(10)
.setKeepAliveTimeInMillis(10000)
.build
}
См. http://doc.akkasource.org/dispatchers-scala
Таким образом, вы могли бы ограничить размер пула потоков, но, опять же, исходный вариант использования, вероятно, мог бы быть удовлетворен с экземплярами актера Akka 50 КБ, использующими диспетчеры по умолчанию, и он хорошо распараллелился бы.
Это действительно только царапает поверхность того, что может сделать Акка. Это приносит много того, что Эрланг предлагает языку Scala. Актеры могут отслеживать других актеров и перезапускать их, создавая приложения для самовосстановления. Akka также предоставляет программную транзакционную память и многие другие функции. Возможно, это «приложение-убийца» или «среда-убийца» для Scala.