Scala中的并发是否自动发生?

时间:2014-01-22 10:48:35

标签: scala

在Scala中,当你编写一个没有副作用且引用透明的函数时,这是否意味着运行时环境会自动将它的处理分配给多个线程?

2 个答案:

答案 0 :(得分:6)

不,通常情况并非如此,除非您明确指定您想要并行处理(例如ScalaCL,并行集合)。它很难自动完成,例如:

def foo() = {
  val x = 1 + 2
  val y = 2 + 3
  x + y
}

尽管x和y 的计算可以并行化,但实际上它比串行代码更慢(由于并行化中的损失)。因此,对于所有内容的自动并行化,您将最终得到基本单元的高效无效代码。

您可以说:为什么不自动并行自动并行代码(例如,当它不值得时不要并行化),但这样的系统必须依赖数十亿因素,最重要的将是一个特定的架构,当前的操作系统负载,运行配置文件,以及更多(我想最终,我们将不得不解决halting problem)。而这个魔法跟踪系统将涉及它自己的惩罚。

最后,尽管存在effect typing research,但是股票标量没有任何方法可以区分副作用和非副作用函数。

毕竟,正如@fracca所展示的那样,手动并行化scala代码并不困难。

答案 1 :(得分:3)

函数不会自动并行运行,但可以轻而易举地执行此操作。

例如,如果您有一个大型集合,则可以通过调用.par

轻松地并行化该操作
(1 to 100000).par.map(_ * 2)

期货,演员和其他策略仍然很有价值。这项工作的最佳工具。