Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在这种情况下,并行性是什么意思?_Scala_Parallel Processing_Akka - Fatal编程技术网

Scala 在这种情况下,并行性是什么意思?

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) } 这是否意味着如果没有副作用,平行性就无法实现?如果这是真的,这一点可以扩展

在这篇关于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应用于元素的顺序可能会有所不同,因为它是平行的,我想可能会涉及一些竞赛。