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线程.所以关键要获得并行的最好水平配置此线程池:
reg*_*ert 11
theon的答案非常好,但我想指出演员不是在Scala中实现并行性的唯一方法.如果您不需要管理状态,Futures通常是一种更简单的并行执行计算的方法.你只是包装的代码的每个片段中,可以在该呼叫其他独立运行Future
使用调用工厂函数,然后你可以撰写/变换每个片段的结果(也并联)map
,flatMap
,fold
等,或与for
内涵.您需要配置的ExecutionContext
只是一个implicit val
,如果您已经在使用Akka,您可以使用您的actor使用的相同的一个,或者您可以使用预配置的全局默认值.
归档时间: |
|
查看次数: |
4004 次 |
最近记录: |