Предполагая, что у вас есть экземпляр ActorSystem
, вы можете проверить значения, установленные в его конфигурации. Вот как вы могли бы получить свою руку от значений, которые вы установили в файле конфигурации:
val system = ActorSystem()
val config = system.settings.config.getConfig("akka.actor.default-dispatcher")
config.getString("type")
config.getString("executor")
config.getString("throughput")
config.getInt("fork-join-executor.parallelism-min")
config.getInt("fork-join-executor.parallelism-max")
config.getDouble("fork-join-executor.parallelism-factor")
Надеюсь, это поможет. Вы также можете обратиться к странице this для получения дополнительной информации об определенных настройках конфигурации.
Update
Я выкопал немного больше в Акку, чтобы узнать точно, что он использует для настройки. Как вы уже могли ожидать, он использует ForkJoinPool
. Параллелизм используется для построения его определяется по формуле:
object ThreadPoolConfig {
...
def scaledPoolSize(floor: Int, multiplier: Double, ceiling: Int): Int =
math.min(math.max((Runtime.getRuntime.availableProcessors * multiplier).ceil.toInt, floor), ceiling)
...
}
Эта функция используется в какой-то момент, чтобы построить ForkJoinExecutorServiceFactory
:
new ForkJoinExecutorServiceFactory(
validate(tf),
ThreadPoolConfig.scaledPoolSize(
config.getInt("parallelism-min"),
config.getDouble("parallelism-factor"),
config.getInt("parallelism-max")),
asyncMode)
Во всяком случае, это параллелизм, который будет использоваться для создания ForkJoinPool
, который фактически является экземпляром java.lang.ForkJoinPool
. Теперь мы должны спросить, сколько потоков использует этот пул? Короткий ответ заключается в том, что он будет использовать всю емкость (80 потоков в нашем случае), только если это понадобится.
Чтобы проиллюстрировать этот сценарий, я провел несколько тестов с различными способами использования Thread.sleep внутри актера. То, что я выяснил, это то, что он может использовать примерно из 10 потоков (если вызов сна не выполняется) вокруг потоков максимум 80 (если я вызываю сон на 1 секунду). Испытания проводились на машине с 8 сердечниками.
Подводя итог, вам нужно будет проверить реализацию, используемую Akka, чтобы увидеть, как именно используется этот параллелизм, поэтому я заглянул в ForkJoinPool
. Кроме того, что я смотрю на файл конфигурации, а затем проверяю эту конкретную реализацию, я не думаю, что вы, к сожалению, можете сделать следующее :(
Надеюсь, это прояснит ответ - изначально я думал, что вы хотите посмотреть, как настроен диспетчер системы актера.
Да, это даст значения, которые были прочитаны из config системой akka. Однако мне интересно узнать, есть ли способ узнать, какой параллелизм выбрал диспетчер akka, в конечном счете, из трех полей - min, factor & max. – Sree
Я обновил ответ после запуска некоторых тестов. Кроме того, @Stefano Bonetti прав - чтобы максимизировать параллелизм, все актеры должны работать одновременно :) –