为什么Scala适合并发?

时间:2010-12-18 11:20:00

标签: scala concurrency

是否有任何特殊的并发运算符,或者功能样式编程是否适合并发?为什么?

5 个答案:

答案 0 :(得分:46)

目前,Scala已经支持两种主要的并发策略 - 基于线程的并发(源自Java)和类型安全的基于Actor的并发(受到启发二郎)。在不久的将来(Scala 2.9),将会有两个重要的补充:

Actor语法(并发运算符)受Erlang的影响很大(有一些重要的补充) - 关于你使用的库(标准actor,Akka,Lift,scalaz),会有不同的问题和感叹号组合: !(在大多数情况下是单向发送邮件),!!!?等。

除此之外,即使您使用旧的Java并发框架:ExecutorService,Fork-Join Framework等,一流的功能也可以让您的生活更轻松。

最重要的是,不变性可以简化并发性,使代码更具可预测性和可靠性。

答案 1 :(得分:16)

有许多语言功能使Scala适合并发。例如:

  • 大多数数据结构都是不可变的,并不需要任何特殊的并发访问。
  • 功能样式是进行高度并发操作的一种非常好的方法。
  • Scala包含一个非常方便的“actor”框架,可以帮助进行并发异步操作。

进一步阅读:

http://www.ibm.com/developerworks/java/library/j-scala02049.html

http://blog.objectmentor.com/articles/2008/08/14/the-seductions-of-scala-part-iii-concurrent-programming

http://akka.io

答案 2 :(得分:10)

嗯,有炒作,有现实。 Scala因为并发性而闻名,因为它是一种函数式语言,并且因为它的actor库。函数式语言有利于并发性,因为它们专注于不可变性,这有助于并发算法。演员得到了他们的声誉,因为他们是Erlang大规模并发系统记录的基础。

因此,从某种意义上说,Scala的声誉是因为成为一种“我也是”成功技术。然而,Scala确实带来了一些东西,它能够通过库支持对语言的这种添加,这使得它能够在设计时适应和采用新技术。

演员不是Scala的原生代码,但是已经有广泛使用的不同库似乎都是。事务性内存也不是,但同样,已经存在看起来像它们的库。

他们这些库甚至可用于java,但是它们使用起来很笨拙。

所以秘诀不在于它能做什么,而是让它看起来很容易。

答案 3 :(得分:7)

这里的大关键字是不变性。见this Wiki page。由于任何变量都可以定义为可变或不可变,因此这是并发的一大胜利,因为如果一个对象无法更改,那么它是线程安全的,因此编写并发程序更容易。

答案 4 :(得分:3)

在每个人的游行中下雨,see this question

我已经在Scala(主要使用Futures,有点使用Actors)和C ++(使用TBB)之后对其进行了双重编码(主要是Project Euler问题)。一般情况似乎是Scala需要1/3的C ++解决方案的代码行数(并且编写速度更快),但C ++解决方案的运行时间会快〜x10(除非你去做一些努力以避免任何问题) “对象流失”,如上面引用的答案中的快速版本所示,但此时你正在失去Scala的优雅之处)。我还在2.7.7。尚未尝试过Scala 2.8。

使用Scala是我第一次真正遇到一种强调不变性的语言,我对它在编程时大大简化你必须维护对象“状态机”的心理模型的能力印象深刻(这反过来又使得编码为了更容易并发)。这无疑影响了我处理C ++编码的方式。