2014-01-22 30 views
1

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

如果是这样,为什么有人工方法在像Actor模型这样的语言中执行并发?

回答

6

不,通常情况下并不意味着如此,除非您以某种方式明确指定需要并行处理(例如ScalaCL,并行集合)。这将是很难不可能它自动地完成,例如:

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

虽然,x和y 的计算可以被并行化,在实践中这将是更慢(由于并行化引起的罚)比串行码。因此,对于所有内容的自动并行化,您将最终得到基本单元的非常无效的代码。

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

最后,虽然有effect typing research,股票scala没有任何方法来区分副作用和非副作用函数。

毕竟,手动并行化scala代码并不难,就像@fracca展示的那样。

3

函数不会自动并行运行,但可以轻松地做到这一点。

举例来说,如果你有一个大的集合,你可以很容易地parallelise致电.PAR

(1 to 100000).par.map(_ * 2) 

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

+2

也许,'(1至100000).par.map(_ * 2)'? – maks

+0

这就是我的意思,谢谢! – fracca