我一直在玩Scala并行集合,我想知道是否有办法轻松定义要使用的工作负载平衡策略。
例如,让我们说我们计算1到K = 500 000之间有多少素数:
def isPrime(k: Int) = (2 to k/2).forall(k % _ != 0)
Array.range(1, 500*1000).par.filter(isPrime).length
如果所有.par
正在进行的是将要处理的数据划分为不同的连续块,那么并行化该算法并没有太大的优势,因为无论如何最后的块将占据总运行时间。
另一方面,运行此算法使得每个线程具有均匀分布的工作份额将解决问题(通过让N
个线程中的每一个从索引x € (0 .. N-1)
开始然后仅工作关于x+kN
)上的元素。
我想避免编写这样的样板代码。是否有一些参数可以让我轻松告诉Scala的库如何做到这一点?