Scala 在这种情况下,并行性是什么意思?
在这篇关于Scala中并行集合的博文中 Daniel Spiewak在评论中提到了这一点: 其他人已经对mkString示例发表了评论,所以我很抱歉 别管它了。它确实反映了一个更大的观点 集合语义。基本上,就是这样:在缺席的情况下 对于副作用(在用户代码中),并行集合具有 与顺序集合的语义完全相同。换句话说: 对于所有{(xs:Vector[A],f:A=>B)=> (x.Par map f)==(xs map f) }Scala 在这种情况下,并行性是什么意思?,scala,parallel-processing,akka,Scala,Parallel Processing,Akka,在这篇关于Scala中并行集合的博文中 Daniel Spiewak在评论中提到了这一点: 其他人已经对mkString示例发表了评论,所以我很抱歉 别管它了。它确实反映了一个更大的观点 集合语义。基本上,就是这样:在缺席的情况下 对于副作用(在用户代码中),并行集合具有 与顺序集合的语义完全相同。换句话说: 对于所有{(xs:Vector[A],f:A=>B)=> (x.Par map f)==(xs map f) } 这是否意味着如果没有副作用,平行性就无法实现?如果这是真的,这一点可以扩展
这是否意味着如果没有副作用,平行性就无法实现?如果这是真的,这一点可以扩展以解释为什么会出现这种情况吗?它将始终并行运行,但当存在副作用时,结果可能会有所不同 假设
A=Int
和B=Int
,代码如下:
var tmp = false
def f(i: Int) = if(!tmp) {tmp = true; 0} else i + 1
这里我们有一个函数f,有一个副作用。在运行代码之前,我假设tmp
为false
运行Vector(1,2,3)。map(f)
将始终导致Vector(0,3,4)
<> >代码>矢量(1,2,3)。PAR图(F)可以得到不同的结果。它可以是向量(0,3,4)
,但由于它是并行的,第二个元素可能首先被映射,等等。因此类似的情况可能会发生向量(2,0,4)
在这种情况下,f
不会产生副作用,您可以确定结果是相同的
这是否意味着如果没有副作用,并行性就不存在
实现了
不,不是这个意思。当Daniel Spiewak这么说的时候
基本上就是这样:在没有副作用的情况下(在用户代码中),
并行集合与顺序集合具有完全相同的语义
收藏
这意味着,如果您的函数没有副作用,那么使用它映射简单集合或并行集合将产生相同的结果。这就是为什么:
另一种方法:FALL {(xs:vector [a],f:a= >b)=>(x.Par map f) ==(xs映射f)}
如果f
无副作用
所以,实际上正好相反:如果有副作用,并行性不是一个好主意,因为结果会不一致。@Kiygo所以当.map并行应用于集合时,新映射集合中元素的顺序取决于每个map函数完成对每个元素的处理的顺序?我认为元素的顺序始终保持不变。只是函数f应用于元素的顺序可能会有所不同,因为它是平行的,我想可能会涉及一些竞赛。