假设您有一个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页面了解有关特定配置设置的更多详细信息。
更新
我已经挖了一点在阿卡找出到底是什么,它使用了您的设置。正如你可能已经预计它使用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个)。
为了说明这种情况,我已经在actor中使用了Thread.sleep的各种用法,进行了一些测试。我发现的是,它可以在大约10个线程(如果没有进行睡眠呼叫)的某处使用到最多80个线程(如果我叫睡1秒)。测试是在一台8芯机器上进行的。
综上所述,您需要检查Akka使用的实现,以确切了解如何使用这种并行性,这就是我查看ForkJoinPool
的原因。除了看配置文件,然后检查特定的实现,我不认为你可以做不幸:(
我希望这个澄清答案 - 最初我以为你想看看如何配置演员系统的调度。
是的,这会给出由akka系统从配置读取的值。不过,我很想知道是否有办法知道akka调度员最终从3个字段中选择的并行度 - min,factor和max。 – Sree
我在运行一些测试后更新了响应。另外,@Stefano Bonetti是对的 - 为了最大限度地发挥所有演员需要同时工作的并行性:) –