scala - как создать общие потоки / пул выполнения для фьючерсов, параллельной коллекции и akka - PullRequest
1 голос
/ 21 марта 2019

Я хочу определить 2 пула потоков в моем приложении.Один исполнитель fork-join и один пул потоков.Кроме того, каждый пул должен быть доступен для актеров Akka, фьючерсов Scala и параллельных коллекций Scala.

В будущем scala нуждается в контексте выполнения в области видимости и может быть создан одним из следующих способов:

implicit val ec = ExecutionContext.global //want to avoid this
import scala.concurrent.ExecutionContext.Implicits.global //want to avoid this
implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(64))
implicit val ec = ExecutionContext.fromExecutor(Executors.newForkJoinThreadPool(64))

Для параллельного сбора вы должны изменить TaskSupport следующим образом

val forkJoinPool = new java.util.concurrent.ForkJoinPool(64)
parArray.tasksupport = new ForkJoinTaskSupport(forkJoinPool)

С учетом вышеизложенного мой единственный вариант - определить глобально val forkJoinPool = new java.util.concurrent.ForkJoinPool(64) в моем приложении и использовать его для обоих.

Однако я не знаю, как использовать один и тот же пул для актеров Акки.Для Akka я вижу по крайней мере следующие 2 способа настройки пула.

val actorSysterm = ActorSystem.create("hello-system", config.getConfig("my-dispatcher”)) 
implicit val executionContext = actorSysterm.dispatcher

implicit val system = ActorSystem()
implicit val executionContext = actorSysterm.dispatchers.lookup("my-dispatcher")

И это основано на файле конфигурации.

my-dispatcher {
  type = Dispatcher
  executor = "fork-join-executor"
  fork-join-executor {
    parallelism-min = 8
    parallelism-factor = 2.0
    parallelism-max = 64
  }
  throughput = 100
}
blocking-io-dispatcher {
  type = Dispatcher
  executor = "thread-pool-executor"
  thread-pool-executor {
    fixed-pool-size = 32
  }
  throughput = 1
}

Я предпочитаю, чтобы Akka создала ExecutionContext, потому что сейчасЯ могу настроить свои пулы в файле hocon (json) и использовать его в приложении Play Framework.Я могу использовать его с Scala Futures, но как теперь использовать его с коллекцией Scala Parallel?Есть ли способ получить доступ к нижележащему пулу из ExecutionContext, чтобы я мог использовать его для инициализации TaskSupport параллельного сбора?

1 Ответ

1 голос
/ 21 марта 2019

Есть еще одна реализация TaskSupport, используемая параллельным сбором, которую я пропустил ранее. С этим я могу использовать тот же executionContext, который я использую для Future и ActorSystem.

pc.tasksupport = new ExecutionContextTaskSupport(executionContext)

...