Multithreading 使用PinnedDispatcher的Akka平衡池
我有几个数据库IO操作要同时运行。在我的情况下,最好使用平衡池路由器 文档说,如果阻塞操作要在worker中发生,那么应该使用线程池执行器,而不是默认的fork-join调度程序 我不想在Akka conf文件中配置它,所以我认为这是在代码中进行配置的方法:Multithreading 使用PinnedDispatcher的Akka平衡池,multithreading,scala,akka,Multithreading,Scala,Akka,我有几个数据库IO操作要同时运行。在我的情况下,最好使用平衡池路由器 文档说,如果阻塞操作要在worker中发生,那么应该使用线程池执行器,而不是默认的fork-join调度程序 我不想在Akka conf文件中配置它,所以我认为这是在代码中进行配置的方法: val router = context.actorOf(BalancingPool(5).withDispatcher("my-pinned-dispatcher").props(Props[History]),
val router = context.actorOf(BalancingPool(5).withDispatcher("my-pinned-dispatcher").props(Props[History]), "HistoryBalancingRouter")
但文件上说,对于PinnedDispatcher:
该调度器为使用它的每个参与者指定一个唯一的线程;
i、 每个参与者都有自己的线程池,其中只有一个线程
游泳池
邮箱:任何,每个参与者创建一个邮箱
而对于BalancingPool,它说员工共享一个邮箱:
平衡池自动使用一个特殊的平衡调度器
它的路由-忽略在
routee道具对象。这是实施该计划所必需的
通过所有路由对象共享同一邮箱来平衡语义
虽然无法更改路由对象使用的调度程序,
可以微调所使用的执行器默认情况下
使用fork join dispatcher,可以按照中的说明进行配置
调度员在预期路由执行的情况下
阻塞操作将其替换为
暗示已分配线程数的线程池执行器
明确地
那么,邮箱和线程到底发生了什么
我的示例是使用线程池执行器实现平衡池的明智方法吗?平衡池始终与平衡调度程序一起工作,它只会拒绝您的PinnedDispatcher设置。原因正是BalancingDispatcher允许参与者共享一个其他Dispatcher不支持的公共邮箱(用于性能) 请注意,有几个分派器允许您配置它们将在内部使用的执行器。默认情况下,对于BalancingPool,它是
fork join executor
(文档错误地说是“fork join dispatcher”),但您可以将其更改为使用线程池执行器。这里有一个调度程序配置示例:您只需要更改执行器类型