gpt4 book ai didi

scala - Parallel Seq 对于执行语句序列有多大好处?

转载 作者:行者123 更新时间:2023-12-01 23:29:09 27 4
gpt4 key购买 nike

我有一个使用 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 实现中有额外的代码来保留其顺序,这就是性能开销)。

请建议我如何做。

最佳答案

Documentation (“语义”部分)解释说,只有两种可能的情况可能导致乱序行为:

  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 .

关于scala - Parallel Seq 对于执行语句序列有多大好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56293984/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com