繁体   English   中英

Parallel Seq对执行语句序列有多大益处?

[英]How beneficial is Parallel Seq for executing sequence of statements?

我有一个使用List.par的小程序

val x = List(1,2,3,4,5).par.map(y => {
    Thread.sleep(2000)
    println(y)
    y + 1
})

println(x)

输出:

3
1
4
5
2
ParVector(2, 3, 4, 5, 6)

这些数字是并行打印的,但返回值始终保持其顺序。

我的目标是并行执行一系列插入语句到SQL数据库。

目前我正在使用理解 我想使用ParSeq,因为语句数量正在增加。

但我担心它是否会导致性能下降。 (如果在map实现中有额外的代码用于保留其顺序,则这是性能开销)。

请建议我怎么做。

文档 (“语义”部分)解释了只有两种可能导致无序行为的可能情况:

  1. 副作用操作可能导致非确定性
  2. 非关联操作导致非确定性

第一个你用println语句观察自己。 第二个可以通过使用非关联二元运算(如减法)轻松测试:

val list = (1 to 100).toList
val a = list.par.reduce(_ - _)

println(a) 

尝试多次运行上面的代码段。

可以由许多工作者并行映射整数列表,因为元素不相互依赖。 每个工作人员都可以在不影响任何其他元素的情况下就地执行操作。 因此,即使它最初可能不直观,但这种处理确实可以从并行化受益(但是为了使改进显而易见,您可能需要更多的元素)。

但是,相同的列表不能与非关联操作并行减少,因为元素确实相互依赖,并且无论您是否执行以下操作都会产生很大的不同:

1 - (2 - (3 - 4))

要么

((1 - 2) - 3) - 4

这就是为什么并行处理集合通常支持reducefold ,而不是foldLeftfoldRight

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM