scala中是否存在快速并发语法糖的实现?例如。的map-reduce

时间:2010-04-28 11:51:32

标签: scala concurrency mapreduce syntactic-sugar

与演员传递信息非常棒。但我希望代码更简单。

示例(伪代码)

val splicedList:List[List[Int]]=biglist.partition(100)
val sum:Int=ActorPool.numberOfActors(5).getAllResults(splicedList,foldLeft(_+_))

其中spliceIntoParts将一个大列表转换为100个小列表 numberofactors部分创建一个池,该池使用5个actor并在作业完成后接收新作业 和getallresults使用列表上的方法。所有这些都是在后台传递的消息完成的。其中可能是getFirstResult,计算第一个结果,并停止所有其他线程(如破解密码)

5 个答案:

答案 0 :(得分:4)

使用将包含在2.8.1中的Scala Parallel集合,您将能够执行以下操作:

val spliced = myList.par // obtain a parallel version of your collection (all operations are parallel)
spliced.map(process _)   // maps each entry into a corresponding entry using `process`
spliced.find(check _)    // searches the collection until it finds an element for which
                         // `check` returns true, at which point the search stops, and the element is returned

并且代码将自动并行完成。常规集合库中的其他方法也正在并行化。

目前,2.8.RC2非常接近(本周或下周),我认为2.8后的决赛将在几周之后到来。如果你使用2.8.1夜宵,你将能够尝试并行收藏。

答案 1 :(得分:3)

您可以使用Scalaz的并发功能来实现您的目标。

import scalaz._
import Scalaz._
import concurrent.strategy.Executor
import java.util.concurrent.Executors

implicit val s = Executor.strategy[Unit](Executors.newFixedThreadPool(5))

val splicedList = biglist.grouped(100).toList
val sum = splicedList.parMap(_.sum).map(_.sum).get

使这个更漂亮是很容易的(即编写一个功能mapReduce,它可以完成分割和折叠)。此外,List上的parMap是不必要的严格。您需要在整个列表准备好之前开始折叠。更像是:

val splicedList = biglist.grouped(100).toList
val sum = splicedList.map(promise(_.sum)).toStream.traverse(_.sum).get

答案 2 :(得分:2)

与使用期货创建演员相比,您可以减少开销:

import scala.actors.Futures._
val nums = (1 to 1000).grouped(100).toList
val parts = nums.map(n => future { n.reduceLeft(_ + _) })
val whole = (0 /: parts)(_ + _())

您必须处理分解问题并编写“future”块并将其重新组合成最终答案,但它确实使得并行执行一堆小代码块变得容易。

(请注意,左侧的_()是未来的应用功能,这意味着“给我你并行计算的答案!”,它会一直阻止,直到答案可用。)

并行集合库会自动分解问题并为您重新组合答案(与Clojure中的pmap一样);那还不是主要API的一部分。

答案 3 :(得分:2)

我不是在等Scala 2.8.1或2.9,而是编写我自己的库或使用另一个更好,所以我做了更多的谷歌搜索并找到了这个:akka http://doc.akkasource.org/actors

有一个带方法的对象期货

awaitAll(futures: List[Future]): Unit
awaitOne(futures: List[Future]): Future

http://scalablesolutions.se/akka/api/akka-core-0.8.1/ 根本没有文件。那很糟糕。

但最重要的是,akka的演员比scala的本地演员更精简 有了所有这些库(包括scalaz),如果scala本身最终可能正式合并它们将会非常棒

答案 4 :(得分:1)

在Scala Days 2010上,Aleksandar Prokopec(正在EPFL的Scala工作)就Parallel Collections进行了一次非常有趣的演讲。这可能是2.8.1,但你可能需要再等一会儿。我会看看我是否可以获得演示文稿。链接到这里。

我们的想法是建立一个集合框架,通过完全按照您的建议进行并行处理集合,但对用户透明。你理论上要做的就是将scala.collections的导入更改为scala.parallel.collections。你显然仍然需要做一些工作,看看你所做的事情是否真的可以实现并行化。