假設您有一個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是對的 - 爲了最大限度地發揮所有演員需要同時工作的並行性:) –