与演员传递信息非常棒。但我希望代码更简单。
示例(伪代码)
val splicedList:List[List[Int]]=biglist.partition(100)
val sum:Int=ActorPool.numberOfActors(5).getAllResults(splicedList,foldLeft(_+_))
其中spliceIntoParts将一个大列表转换为100个小列表 numberofactors部分创建一个池,该池使用5个actor并在作业完成后接收新作业 和getallresults使用列表上的方法。所有这些都是在后台传递的消息完成的。其中可能是getFirstResult,计算第一个结果,并停止所有其他线程(如破解密码)
答案 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。你显然仍然需要做一些工作,看看你所做的事情是否真的可以实现并行化。