在Scala中,当你编写一个没有副作用且引用透明的函数时,这是否意味着运行时环境会自动将它的处理分配给多个线程?
答案 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)
期货,演员和其他策略仍然很有价值。这项工作的最佳工具。