将并行集合与Akka混合

时间:2014-01-27 15:59:54

标签: scala parallel-processing akka scala-collections

scala并行收集操作的效果与Akka Actors(和Futures)在系统上的有效调度方面使用的并发/并行性有关吗?

演员和期货的执行由ExecutionContext通常提供的Dispatcher处理。我在并行集合上发现的内容表明它们使用TaskSupport对象。我找到了一个ExecutionContextTaskSupport对象可以连接这两个但不确定。

混合两种并发解决方案的正确方法是什么,或者建议不要这样做?

1 个答案:

答案 0 :(得分:3)

目前不支持/处理好。

在Scala 2.11-M7之前,尝试将调度程序用作ContextExecutor会引发异常。

也就是说,actor的receive中的以下代码将抛出NotImplementedError

val par = List(1,2,3).par
par.tasksupport = new ExecutionContextTaskSupport(context.dispatcher)

par foreach println

顺便提一下,这已在2.11-M7中修复,但未采取措施纠正上述问题 在阅读有关修复的注释时,听起来好像ExecutionContextTaskSupport在上述情况下提供的实现可能比直接使用其他任务TaskSupport实现有一些开销;但是,我没有采取任何措施来测试这种解释或评估任何影响的程度。


关于并行集合的注释:
默认情况下,Parallel Collections将使用全局ExecutorContext(ExecutionContext.Implicits.global),就像您可能用于Futures一样。虽然这很好,但是如果你想受调度员约束(使用context.dispatcher) - 正如你可能在Akka中使用Futures一样 - 你需要设置一个不同的TaskSupport,如图所示上面的代码示例。