并行映射操作?

csv*_*van 18 concurrency scala parallel-collections

Scala是否提供了一种执行并行映射操作的方法作为标准语言的一部分?

例如,给定:

scala> val a = List((1,2), (3,4), (3,6))
a: List[(Int, Int)] = List((1,2), (3,4), (3,6))
Run Code Online (Sandbox Code Playgroud)

我可以:

scala> a.map(tup => tup._1 + tup._2)
res0: List[Int] = List(3, 7, 9)
Run Code Online (Sandbox Code Playgroud)

但是,据我所知,这将按顺序将提供的函数映射到列表对象上.是否有内置的方法将函数应用于单独的线程(或等效的)中的每个元素,然后将结果收集到结果列表中?

Ako*_*chy 33

如果您添加,par那么您将获得并行收集,并且将对其进行并行处理.要转换回正常的集合,请调用a toList.

所以你的代码看起来像:

a.par.map(tup => tup._1 + tup._2).toList
Run Code Online (Sandbox Code Playgroud)

或者a .seq获得顺序集合(与并行集合相反).

a.par.map(tup => tup._1 + tup._2).seq
Run Code Online (Sandbox Code Playgroud)

另外,请查看文档.


mik*_*łak 8

par拆分列表以便处理多个线程.然后,您可以通过修改结果的tasksupport成员来调节线程的完成方式ParSeq.