首页 > 解决方案 > 与 Java 或其他非函数式语言相比,Scala 究竟如何利用更多内核?

问题描述

我最近在听 Martin Odersky 的视频,他试图解释函数式语言(例如 Scala,但当然不一定是Scala)相对于 OOP 或过程语言的基本优势。

换句话说,他解释说摩尔定律最近让我们失望了,因此为了让处理器“更快”,而不是能够将内核中的晶体管数量增加一倍,CPU 制造商只是提供更多内核。这反过来又使并发/多线程应用程序可以更充分地利用 CPU。因此,主要的收获是:应用程序的并发性越高,其代码片段在不同内核上同时运行的代码片段就越多,CPU 上的内核越多,程序执行的总体速度就越快。

到目前为止,一切都很好。

他没能解释(或者更可能是我没能理解的)是为什么像 Scala 这样的函数式语言比其他非函数式语言更具有并发性。由于我们碰巧在谈论 JVM 空间,让我们快速比较一下 Java 和 Scala。如果 Scala 程序是用纯 Java 实现的,那么它是什么意思?

这意味着我有两个 JVM 应用程序,用 Java 编写的 App1 和用 Scala 编写的 App2。他们都执行完全相同的任务并完成相同的事情。两者都被编译为 JVM 字节码,并在安装了相同 JVM 的同一台计算机上运行。Scala 应用程序如何能够“利用”JVM 功能,使其比 Java 应用程序更适合并发(因此,在具有更多内核的 CPU 上更快)?

标签: javascalaconcurrencyfunctional-programmingmulticore

解决方案


当您说您的两个应用程序最终归结为 JVM 上的字节码时,您是绝对正确的。Scala 可用于并发的大多数库和框架也可用于 Java。然而,让 Scala 与众不同的是Scala 内置的 对 immutability 的支持。Scala 有非常丰富的不可变集合,这种包含不变性的特性使得为并发和并行应用程序编写代码变得更加容易。Scala 将用户从编写线程级代码中抽象出来,让用户更多地关注业务逻辑。在此期间,Futures API 非常方便。

Scala 采用函数式编程范式(即组合函数)并隔离actor 中的可变状态,通过它您可以消除您可能遇到的所有典型并发问题,例如Java 中的编程线程。这就是为什么选择 Scala 作为设计 Spark 的语言。

现在来谈谈你的问题的主要部分,即 scala 与其他非功能语言相比如何利用更多内核:- scala 中的 Futures API 有一个底层执行上下文,它只不过是一个可由开发人员配置的线程池。使用此 API,您将能够利用所有核心。


推荐阅读