Scala如何实现并行性?

nit*_*h99 13 scala multicore actor-model actor akka

我正在学习分布式系统课程,我们必须使用Scala制作项目.我们的讲师告诉我们,Scala在使用多个内核进行计算并使用并行性来解决问题同时与actor模型集成的意义上是好的.

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

简而言之,我的问题是:当我们在Scala中使用Akka库声明多个actor时,Scala编译器是否会自动使用多核CPU功能在内核之间分配各种actor,或者程序员是否必须提供一些输入才能执行此操作?

the*_*eon 23

TL; DR:使用Akka中的默认配置,您无需为大多数用例提供相当好的并行性.

更长的答案: Akka中的Actor在Dispatcher上运行,并且Dispatcher有一个ExecutionService,它通常是一个Threads池.线程数由开发人员配置,但默认情况下是计算机上CPU核心数的3倍(请参阅参考配置中的default-dispatcher.parallelism-factor 此处).

在任何时间点的每个CPU核心可以运行使用这些线程中的一个演员,所以只要你有许多在调度员的ExecutionService线程等于你的CPU内核的数量,你就能够利用你所有的核心.这被设置为在默认配置芯的三倍的数量的理由是补偿阻塞IO.

IO很慢,并且在您执行IO而不是使用CPU时阻塞调用hog线程.所以关键要获得并行的最好水平配置此线程池:

  • 如果您只进行非阻塞IO,则可以将其设置为您拥有的CPU核心数,并确信您正在充分利用CPU.
  • 越堵IO这样做,更多的线程,你将需要保持获得良好的并行性,但被警告 - 你用多线程,更多的内存,您将使用和线程是不是世界上最轻便的东西.


reg*_*ert 11

theon的答案非常好,但我想指出演员不是在Scala中实现并行性的唯一方法.如果您不需要管理状态,Futures通常是一种更简单的并行执行计算的方法.你只是包装的代码的每个片段中,可以在该呼叫其他独立运行Future使用调用工厂函数,然后你可以撰写/变换每个片段的结果(也并联)map,flatMap,fold等,或与for内涵.您需要配置的ExecutionContext只是一个implicit val,如果您已经在使用Akka,您可以使用您的actor使用的相同的一个,或者您可以使用预配置的全局默认值.