为什么Scala适合并发性?

为什么Scala适合并发性?,scala,concurrency,Scala,Concurrency,是否有特殊的并发操作符,或者函数式编程是否有利于并发?为什么呢?这里最重要的关键词是不变性。看见由于任何变量都可以定义为可变或不可变,这是并发性的一大优势,因为如果对象无法更改,它是线程安全的,因此编写并发程序更容易。有许多语言特性使Scala有利于并发性。例如: 大多数数据结构是不可变的,不需要任何特殊的并发访问 函数式是执行高度并发操作的一种非常好的方式 Scala包含一个非常方便的“actor”框架,可以帮助进行并发异步操作 进一步阅读: 目前,Scala已经支持两种主要的并发策略

是否有特殊的并发操作符,或者函数式编程是否有利于并发?为什么呢?

这里最重要的关键词是不变性。看见由于任何变量都可以定义为可变或不可变,这是并发性的一大优势,因为如果对象无法更改,它是线程安全的,因此编写并发程序更容易。

有许多语言特性使Scala有利于并发性。例如:

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


目前,Scala已经支持两种主要的并发策略——基于线程的并发(源自Java)和基于类型安全的参与者的并发(受Erlang启发)。在不久的将来(Scala 2.9),将有两个大的补充:

  • (Clojure中并发的基础,可能是Haskell中第二流行的并发样式)
  • (无需详细说明,它们允许并行基本收集转换器,如跨多个线程的
    foreach
    map
Actor语法(并发操作符)受Erlang的影响很大(还有一些重要的补充)-关于您使用的库(标准actors、Akka、Lift、scalaz),将有不同的问号和感叹号组合:
(在大多数情况下,用于单向发送消息),
,等等

除此之外,即使在使用旧的Java并发框架(ExecutorService、Fork-Join框架等)时,一流的函数也会让您的生活变得更加轻松


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

好吧,有宣传,也有现实。Scala因擅长并发而出名,因为它是一种函数式语言,并且因为它的actors库。函数式语言有利于并发,因为它们关注不变性,这有助于并发算法。参与者之所以获得声誉,是因为他们是Erlang大规模并发系统记录的基础


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

actor不是Scala的本地语言,但是已经有很多不同的库被广泛使用了。事务性内存和事务性内存都不一样,但同样,已经有一些库看起来像事务性内存

它们,这些库,甚至可以用于java,但在那里它们很难使用


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

只是为了给每个人的游行泼点冷水

我已经在斯卡拉中对代码进行了一个公平的编码(主要是使用期货,还有一些演员)和C++(使用TBB)(主要是项目Euler问题)。一般的图片看起来是Scala需要1/3的C++代码行数(而且写得更快),但是C++解决方案将是X10更快的运行时间(除非你去努力避免任何“对象搅动”。,如上面提到的答案中的快速版本所示,但在这一点上,您将失去Scala的许多优雅)。我仍然在2.7.7提醒你;还没有尝试Scala 2.8


使用Scala是我第一次真正接触到一种非常强调不变性的语言,它的强大功能极大地简化了编程时必须维护的对象“状态机”的心智模型,这给我留下了深刻的印象(这反过来又使并发编码变得更容易)。它肯定影响了我如何接近C++编码。

并发性,你也必须考虑Erlang。而且它的OTP框架是令人敬畏的“不变变量”:我一直很喜欢这个短语到底有多荒谬…@Kevin:是的,需要有人为这个短语发明一个新词。我现在倾向于说“参考”。所以我可以明确地说“对可变值的不可变引用”或“对不可变值的可变引用”。在实践中,它对我很有效。“价值”这个词怎么样?不可变值。您错过了数据流并发,这是通过延迟VAL和按名称参数实现的。我还想说,fork-join本身就是一个范例,与并行集合密切相关。什么是基于类型安全的Actor并发?我很想看看如果使用Akka Actors实现它,性能是否会有任何差异。首先,Scala还处于初级阶段;我们可以预期,与Java一样,它的性能将随着编译的成熟而提高。第二,如果你从亚马逊网络服务公司租用一台电脑,每小时的成本约为8美分,而一个刚开始的程序员每小时的满载成本约为80美元(也就是说,包括福利费、办公费和成本)。如果在C++中编写一个程序需要更长的时间,那比让Scala等效运行六周更长。第三,选择一种语言是因为它在运行时更快,这是过早优化的一个主要例子,我们都被警告过。Malvolio:只有在结果延迟六周没有成本(机会成本、人们等待等)的情况下,才会这样做。为某样东西花六周的周转时间可能要花费数百万美元。@Malvolio:我完全同意需要考虑更大的前景;这就是为什么我一直坚持使用Scala解决项目中的问题。对我来说,将20秒Scala运行时压缩到2的最小值