我有几个数据库IO操作希望能同时运行。在我的情况下,最好使用BalancingPool路由器。
文档中提到,如果工作进程中涉及阻塞操作,则应该使用线程池执行器而不是默认的fork-join-dispatcher。
我不想在Akka配置文件中进行配置,因此我认为这应该是在代码中完成的方式:
val router = context.actorOf(BalancingPool(5).withDispatcher("my-pinned-dispatcher").props(Props[History]), "HistoryBalancingRouter")
但是文档中对于PinnedDispatcher的说明如下:
这个派发器为每个使用它的Actor分配了一个独特的线程; 也就是说每个Actor都将拥有自己的线程池,该池中只有一个线程。
邮箱:任何,每个Actor都创建一个
而对于BalancingPool,它指出工作线程共享单个邮箱:
BalancingPool自动为其路由器使用特殊的BalancingDispatcher - 忽略在路由器Props对象上设置的任何调度程序。这是必要的,以通过所有路由器共享同一邮箱来实现平衡语义。
虽然无法更改路由器使用的调度程序,但可以对使用的执行程序进行微调。 默认情况下会使用fork-join-dispatcher,并可按Dispatchers中所述进行配置。在预期路由器执行阻塞操作的情况下,将其替换为线程池执行者并显式指定分配的线程数可能很有用
那么这里到底发生了什么,与邮箱和线程有什么关系?
我使用线程池执行程序实现BalancingPool的示例是否合理?