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

gab*_*x01 1 scala

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

om-*_*nom 6

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

def foo() = {
  val x = 1 + 2
  val y = 2 + 3
  x + y
}
Run Code Online (Sandbox Code Playgroud)

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

你可以说:你为什么不自动并行代码选择性(当它是不值得例如,不要并行),但这样的系统必须依靠数十亿的因素,最重要的将是一个特定的架构,目前的OS负载,运行配置文件,以及更多(我想最终,我们将不得不解决暂停问题).而这个魔法跟踪系统将涉及它自己的惩罚.

最后,尽管存在效果类型研究,但是库存标量没有任何方法来区分副作用和非副作用功能.

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