13

I am taking a course on distributed systems and we have to make our project using Scala. Our instructor told us that Scala is good in the sense that it uses multiple cores to do the computation and uses parallelism to solve problems while being integrated with the actor model.

This is a theoretical question. I have learned some basics about the actor model using Akka and my question is that, while programming, does the user have to provide the details to the compiler so that various actors work on multiple cores, or does Scala take care of that and use multiple cores for various actors?

In a nutshell my question is: when we declare multiple actors using the Akka libraries in Scala, does Scala compiler automatically use the multi-core CPU power to distribute various actors among cores, or does the programmer have to provide some input to do this?

4

2 回答 2

23

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

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

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

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

  • 如果您只做非阻塞 IO,您可以将其设置为您拥有的 CPU 内核数,并确信您正在充分利用您的 CPU。
  • 你做的阻塞 IO 越多,你需要越多的线程来保持良好的并行性,但要注意 - 你使用的线程越多,你将使用的内存越多,线程不是世界上最轻量级的东西。
于 2013-09-13T19:28:40.920 回答
11

theon 的回答非常好,但我只想指出,actor 并不是在 Scala 中实现并行性的唯一方法。如果您不需要管理状态,Futures 通常是一种更简单的并行执行计算的方法。您只需将每个可以独立运行的代码片段包装在对Future工厂函数的调用中,然后您可以使用对mapflatMapfold等的调用或使用for推导来组合/转换每个片段的结果(也可以并行) . 你只需要配置一个ExecutionContextas an implicit val,如果你已经在使用 Akka,你可以使用你的 actor 使用的同一个,或者你可以使用预先配置的全局默认值。

于 2013-09-16T23:54:29.863 回答