为什么akka默认使用ForkJoinPool线程池?用户actor的代码也不是map reduce算法,使用ForkJoinPool可以获益吗?
Akka 如何从 ForkJoinPool 中受益?
Akka 文档指出默认调度程序是
fork-join-executor
因为它“在大多数情况下提供出色的性能”。
我想知道为什么会这样?
ForkJoinPool
与其他类型的 ExecutorService 的不同之处主要在于其采用了工作窃取:池中的所有线程都尝试查找并执行提交到池或由其他活动任务创建的任务(如果不存在,则最终阻塞等待工作)。这使得**(1)当大多数任务产生其他子任务时(就像大多数 ForkJoinTasks一样),以及(2)当许多小任务从外部客户端提交到池时**,可以进行有效处理。尤其是在构造函数中将asyncMode设置为 true 时,ForkJoinPools 也可能**(3)适用于从未连接的事件式任务。**
Java ForkJoinPool与非递归任务,,工作窃取是否有效?
如果没有递归,工作窃取在 ForkJoinPool 中是否仍然有效?
-
ForkJoinPool
每个工作线程都有一个工作队列(我们称之为“worker queues")。fork tasks 别推入本地工作队列,准备再次被工作人员弹出并执行——换句话说,从工作线程的角度来看,它看起来像一个堆栈。当一个工作耗尽了它的工作队列时,它会四处寻找并试图从其他工作队列中窃取tasks。这就是工作窃取。 -
您可以重用工作队列可用的大多数机制。您甚至可以将这些提交队列松散地分发给每个工作线程。现在,外部提交进入其中一个提交队列。然后,没有工作可做的worker可以先查看与某个特定worker关联的提交队列,然后再四处查看其他worker的提交队列。人们也可以称之为“偷工作”。