Akka:如何使平衡池中的actor数量相对于线程池大小

时间:2015-03-04 20:52:43

标签: scala concurrency akka

对于包含我的应用程序中的键计算的Actor类,我在路由器后面产生了一堆演员:

val concurrency = 4 // to be replaced by something dynamic
val ahoCorasick = AppActorSystem.system.actorOf(MyActorClass.props(ldb)
                                         .withRouter(BalancingPool(nrOfInstances = concurrency)), 
                                          name = "foo") 

如何获取相对于核心数量的Actor实例数量,或者应用于actor系统的线程池大小?例如每个核心一个Actor,还是一些等于提供的线程池大小的actor? (也可能定义特定于这些actor的线程池)。

1 个答案:

答案 0 :(得分:3)

最好从Akka配置中获取线程数(reference.confapplication.conf)。以下是解释其配置方式的参考doc。您可以拥有自定义调度程序或默认调度程序,因此最好不要盲目使用下面的代码,而是要了解您实际使用的调度程序。

你可以这样做:

import akka.actor.ActorSystem
import com.typesafe.config.{Config, ConfigFactory}

val conf = ConfigFactory.load().getConfig("akka.actor.default-dispatcher.fork-join-executor")

def getThreadConf(conf: Config): (Int, Int, Int) = {
  val parallelismFactor = conf.getInt("parallelism-factor")
  val parallelismMin = conf.getInt("parallelism-min")
  val parallelismMax = conf.getInt("parallelism-max")
  (parallelismFactor, parallelismMin, parallelismMax)
}

println(getThreadConf(conf))
val system = ActorSystem()
println(getThreadConf(system.settings.config.getConfig("akka.actor.default-dispatcher.fork-join-executor")))

默认情况下,您获得:

factor: 3, min: 8, max: 64

检查您正在使用的调度程序的名称,或使用val myActor = context.actorOf(Props[MyActor].withDispatcher("my-dispatcher"), "myactor1")

明确设置一个