【发布时间】:2013-11-20 10:07:03
【问题描述】:
Scala 是否提供了一种方法来执行并行映射操作作为标准语言的一部分?
例如,给定:
scala> val a = List((1,2), (3,4), (3,6))
a: List[(Int, Int)] = List((1,2), (3,4), (3,6))
我能做到:
scala> a.map(tup => tup._1 + tup._2)
res0: List[Int] = List(3, 7, 9)
但是,据我所知,这会将提供的函数按顺序映射到列表对象上。是否有一种内置方法可以将函数应用于单独线程(或等效线程)中的每个元素,然后将结果收集到结果列表中?
【问题讨论】:
-
不要将
List用于分布式(par)操作。你应该使用IndexedSeq。 -
@senia - 您能否简单说明一下为什么在这种情况下使用列表是个坏主意?我不需要以任何方式对结果列表进行排序。
-
这是因为
par方法创建parallel collection的方式。对于Vector(默认IndexedSeq实现)、Range和Array,它只是用轻量级包装器包装初始集合。但是对于List,它应该创建一个全新的集合,这可能会导致性能问题。见Creating a Parallel Collection。 -
为了语言的精确性,“并行”和“分布式”真的不应该混为一谈。
-
对,解决这个问题。另外,非常感谢@senia 的澄清
标签: scala concurrency parallel-collections