gpt4 book ai didi

scala - Scala 如何实现并行性?

转载 作者:行者123 更新时间:2023-12-03 23:00:21 28 4
gpt4 key购买 nike

我正在学习分布式系统的类(class),我们必须使用 Scala 来制作我们的项目。我们的讲师告诉我们,Scala 的优势在于它使用多个内核进行计算,并在与参与者模型集成的同时使用并行性解决问题。

这是一个理论问题。我已经使用 Akka 学习了有关 actor 模型的一些基础知识,我的问题是,在编程时,用户是否必须向编译器提供详细信息,以便各种 actor 在多个内核上工作,或者 Scala 是否会处理这些问题并使用多个各种 Actor 的核心?

简而言之,我的问题是:当我们在 Scala 中使用 Akka 库声明多个 actor 时,Scala 编译器是自动使用多核 CPU 的能力在内核之间分配各种 actor,还是程序员必须提供一些输入来做到这一点?

最佳答案

TL;博士:使用 Akka 中的默认配置,对于大多数用例,您无需执行任何操作即可获得相当好的并行性。

更长的答案: Akka 中的 Actor 在 Dispatcher 上运行并且 Dispatcher 有一个 ExecutionService,它通常是一个线程池。线程数由开发者配置,但默认是机器CPU核数的3倍(参见引用配置中的default-dispatcher.parallelism-factor here)。

在任何时候,每个 CPU 内核都可以使用这些线程之一运行一个 Actor,因此如果您的 Dispatcher 的 ExecutionService 中的线程数等于 CPU 上的内核数,您将能够利用你所有的核心。之所以将其设置为默认配置中核心数的三倍,是为了补偿阻塞 IO。

IO 很慢,并且在您执行 IO 而不是使用 CPU 时,阻塞调用会占用线程。所以获得最佳并行度的关键是配置这个线程池:

  • 如果您只进行非阻塞 IO,您可以将其设置为您拥有的 CPU 内核数,并确信您正在充分利用您的 CPU。
  • 你做的阻塞 IO 越多,你需要越多的线程来保持良好的并行性,但要注意 - 你使用的线程越多,你将使用的内存越多,线程不是世界上最轻量级的东西。
  • 关于scala - Scala 如何实现并行性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18793728/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com