Я хочу определить 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
параллельного сбора?