【问题标题】:What is meant by parallelism in this case?在这种情况下,并行性是什么意思?
【发布时间】:2014-02-02 09:01:58
【问题描述】:

在这篇关于 Scala 中并行集合的博文中http://beust.com/weblog/2011/08/15/scalas-parallel-collections/

这在 Daniel Spiewak 的评论中提到:

其他人已经评论了 mkString 示例,所以我 不理会它。它确实反映了一个更大的观点 一般的集合语义。基本上,就是这样:在没有 副作用(在 user 代码中),并行集合具有 exact 与顺序集合的语义相同。换一种方式: forAll { (xs: Vector[A], f: A => B) => (xs.par 映射 f) == (xs 映射 f) }

这是否意味着如果没有副作用就无法实现并行性?如果这是真的,这点可以扩展来解释为什么会这样吗?

【问题讨论】:

    标签: scala parallel-processing akka


    【解决方案1】:

    这是否意味着如果没有副作用,并行性不是 达到了吗?

    不,不是这个意思。当 Daniel Spiewak 这么说时

    基本上就是这样:在没有副作用的情况下(在用户代码中), 并行集合具有与顺序集合完全相同的语义 收藏。

    这意味着如果您的函数没有副作用,那么使用它来映射简单集合或并行集合将产生相同的结果。这就是为什么:

    换一种说法:forAll { (xs: Vector[A], f: A => B) => (xs.par map f) == (xs 映射 f) }

    如果f 没有副作用。

    所以,实际上恰恰相反:如果有副作用,并行不是一个好主意,因为结果会不一致。

    【讨论】:

      【解决方案2】:

      它总是并行运行,但是当有副作用时结果可能会有所不同。

      假设A = IntB = Int 使用以下代码:

      var tmp = false
      
      def f(i: Int) = if(!tmp) {tmp = true; 0} else i + 1
      

      所以这里我们有一个带有副作用的函数 f。在运行代码之前,我假设tmpfalse

      运行Vector(1,2,3).map(f) 将始终导致Vector(0,3,4)

      但是Vector(1,2,3).par.map(f) 可以有不同的结果。它可以是Vector(0,3,4),但由于它是并行的,因此第二个元素可能首先被映射,等等。所以可能会发生这样的事情Vector(2,0,4)

      你可以确定结果是一样的,在这种情况下f 不会有副作用。

      【讨论】:

      • @Kiygo 因此,当 .map 并行应用于集合时,新映射集合中元素的顺序取决于每个映射函数何时完成对每个元素的处理?
      • 我认为元素的顺序始终保持不变。只是函数 f 应用于元素的顺序可能会有所不同,因为它是并行的,而且我猜其中涉及到一些赛车。
      猜你喜欢
      • 2020-04-04
      • 2017-03-28
      • 2016-08-26
      • 2014-10-27
      • 2019-10-15
      • 2020-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      相关资源
      最近更新 更多