Akka Balancing Pool具有可变大小的Thread-Pool-Executor

时间:2016-12-16 22:52:07

标签: scala akka threadpoolexecutor akka-actor akka-dispatcher

这是我的用例:

我想创建一个大小为x的Balancing-Pool路由器(x是在运行时确定的实例/路由的数量),每个路由都有自己的专用线程。 每个路由都应该执行阻塞操作。

Akka文档解释说,您无法更改平衡池的调度程序。这消除了使用固定调度程序的选项(这将完全符合我的需要,每个空白的大小为1的线程池)。

来自Akka documentation

  

BalancingPool会自动为其路由使用特殊的BalancingDispatcher - 忽略在routee Props对象上设置的任何调度程序。为了通过所有路由共享相同的邮箱来实现平衡语义,这是必需的。

     

虽然无法更改路由使用的调度程序,但可以微调使用的执行程序。默认情况下,使用 fork-join-dispatcher ,可以按照Dispatchers [AJ中的说明进行配置]:我认为这是一个错字,他们的意思是叉加入执行人] 的。在路由器应该执行阻塞操作的情况下,用线程池执行器替换它明确暗示已分配线程的数量可能是有用的

从Akka docs中配置样本:

akka.actor.deployment {
  /parent/router10b {
    router = balancing-pool
    nr-of-instances = 5
    pool-dispatcher {
      executor = "thread-pool-executor"

      # allocate exactly 5 threads for this pool
      thread-pool-executor {
        core-pool-size-min = 5
        core-pool-size-max = 5
      }
    }
  }
}

似乎具有匹配路由数量的池大小的线程池执行器可以工作,但问题是:如何动态(在运行时)设置我的线程池执行器的池大小以匹配该数字如果必须在配置中明确设置池大小,那么路由是什么?

此外,是否可以在从配置中提取其路由的执行程序的同时创建Balancing-Pool(代码中)? 即我不想使用配置来定义我的路由器,我想使用:

val myRouter = BalancingPool(x).props(Props[Worker])...)

但不知何故使用相同的withMailbox()或withDispatcher()

指定要使用的执行器(来自配置)

Balancing Dispatcher is "Driven by: java.util.concurrent.ExecutorService"以来,是否可以创建ExecutorService并将其传递给平衡池路由器或其调度程序?

1 个答案:

答案 0 :(得分:0)

也许是这样的:

val bp = BalancingPool(instances, routerDispatcher = "pinned-dispatcher")
val myRouter = context.actorOf(Props...)
    .withRouter(bp),
  name = "myRouter")