Scala 2.11.x并发:工作池做类似map-reduce的事情?

时间:2014-09-16 10:54:32

标签: scala concurrency actor future

在Scala中实现工作池的惯用方法是什么,这样来自某个源的工作单元可以分配给下一个空闲工作者并异步处理?每个工人都会产生一个结果,最终所有结果都需要结合起来才能产生整体结果。 我们不知道我们需要提前运营工人的工作单位数量,而且我们事先并不知道最佳工人数量,因为这取决于我们运行的系统。 所以应该发生的事情大致如下:

for each work unit, eventually start a worker to process it
for each finished worker, combine its result into the global result
return the global result after all the worker results have been combined

这应该完全由期货来完成,无论有多少工作单位和多少工人?如果结果只能在全部可用时合并,该怎么办? 我见过的大多数期货都有固定数量的期货,然后用它们来理解它们的组合,但是如果期货的数量未知且我有例如只是一个任意数量的期货的集合?如果有数十亿个更容易的工作单元以这种方式进行处理而不仅仅是几十个长期运行的工作单怎么办? 是否有其他更好的方法来做到这一点,例如与演员相反?

当每个工人的结果不需要合并而且每个工人完全独立于其他工人时,设计如何理想地改变?

1 个答案:

答案 0 :(得分:3)

您的问题中有太多问题无法解决所有问题。

基本上,Future会做你想做的事,你可以创建更适合你需要的ExecutionContext。要合并结果:Future.sequence