是否有任何特殊的并发运算符,或者功能样式编程是否适合并发?为什么?
答案 0 :(得分:46)
目前,Scala已经支持两种主要的并发策略 - 基于线程的并发(源自Java)和类型安全的基于Actor的并发(受到启发二郎)。在不久的将来(Scala 2.9),将会有两个重要的补充:
foreach
或map
。) Actor语法(并发运算符)受Erlang的影响很大(有一些重要的补充) - 关于你使用的库(标准actor,Akka,Lift,scalaz),会有不同的问题和感叹号组合: !
(在大多数情况下是单向发送邮件),!!
,!?
等。
除此之外,即使您使用旧的Java并发框架:ExecutorService,Fork-Join Framework等,一流的功能也可以让您的生活更轻松。
最重要的是,不变性可以简化并发性,使代码更具可预测性和可靠性。
答案 1 :(得分:16)
有许多语言功能使Scala适合并发。例如:
进一步阅读:
http://www.ibm.com/developerworks/java/library/j-scala02049.html
答案 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 ++编码的方式。