Scala 将并行集合与Akka混合
scala并行收集操作与Akka Actors(和Futures)在系统上高效调度方面使用的并发/并行性有多好 参与者和未来的执行由Scala 将并行集合与Akka混合,scala,parallel-processing,akka,scala-collections,Scala,Parallel Processing,Akka,Scala Collections,scala并行收集操作与Akka Actors(和Futures)在系统上高效调度方面使用的并发/并行性有多好 参与者和未来的执行由ExecutionContext处理,通常由调度程序提供。我在并行集合中发现的结果表明它们使用了TaskSupport对象。我发现了一个ExecutionContextTaskSupport对象,该对象可能连接这两个对象,但不确定 混合使用这两种并发解决方案的正确方法是什么?或者建议不要这样做?目前,这一点没有得到很好的支持/处理 在Scala 2.11-M7之前,
ExecutionContext
处理,通常由调度程序提供。我在并行集合中发现的结果表明它们使用了TaskSupport
对象。我发现了一个ExecutionContextTaskSupport
对象,该对象可能连接这两个对象,但不确定
混合使用这两种并发解决方案的正确方法是什么?或者建议不要这样做?目前,这一点没有得到很好的支持/处理
在Scala 2.11-M7之前,尝试将调度程序用作ContextExecutor会引发异常
也就是说,参与者接收中的以下代码将抛出一个NotImplementedError
:
val par = List(1,2,3).par
par.tasksupport = new ExecutionContextTaskSupport(context.dispatcher)
par foreach println
顺便说一句,这在2.11-M7中已被修复,但并不是为了纠正上述问题。
在阅读有关修复程序的注释时,听起来像是在上述情况下由ExecutionContextTaskSupport
提供的实现可能比直接使用其他TaskSupport实现有一些开销;然而,我没有做任何事情来测试这种解释或评估任何影响的大小
关于平行收集的一点说明:
默认情况下,并行集合将使用全局ExecutionContext(ExecutionContext.Implicits.global
),就像您可能用于未来一样。虽然这是一种良好的行为,但如果您希望受调度程序的约束(使用context.dispatcher
)-正如您可能在Akka中使用期货一样,您需要设置不同的TaskSupport
,如上面的代码示例所示