为什么ListBuffer.par foreach不起作用?

时间:2015-10-22 21:07:44

标签: scala parallel-processing

在Scala计划中,我有:

var steps : ListBuffer[Step] = new ListBuffer[Step]
var newsteps : ListBuffer[Step] = new ListBuffer[Step]
// why par is not working ?
steps.foreach(step => newsteps ++= step.execute())

这很有效。 step仅在内部状态下运行,所有数据都是不可变的。然而,当我添加par来并行化工作时:

steps.par.foreach(step => newsteps ++= step.execute())

结果不可预测。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:0)

ListBuffer不是线程安全的,你从多个线程中追加它(newsteps++=)(当你在并行集合上调用foreach时会发生这种情况。)

此外,Scala不鼓励将副作用与并行操作混合:

给定并行集合框架的并发执行语义,通常应避免对集合执行的操作引起副作用,以便维持确定性。

http://docs.scala-lang.org/overviews/parallel-collections/overview.html