【问题标题】:Difference between { zip map } and { flatMap map } in Future of ScalaScala 未来中 { zip map } 和 { flatMap map } 之间的区别
【发布时间】:2020-07-09 02:51:02
【问题描述】:

我正在阅读《hands on scala》,其中一项练习是并行化归并排序。

我想知道为什么for-comprehension(可以翻译成flatMap和map)比zip和map花费更多时间。

我的代码:

def mergeSortParallel0[T: Ordering](items: IndexedSeq[T]): Future[IndexedSeq[T]] = {
    if (items.length <= 16) Future.successful(mergeSortSequential(items))
    else {
        val (left, right) = items.splitAt(items.length / 2)
        for (
          l <- mergeSortParallel0(left);
          r <- mergeSortParallel0(right)
        ) yield merge(l, r)
    }
}
  

书提供的标准答案:

def mergeSortParallel0[T: Ordering](items: IndexedSeq[T]): Future[IndexedSeq[T]] = {
    if (items.length <= 16) Future.successful(mergeSortSequential(items))
    else {
        val (left, right) = items.splitAt(items.length / 2)
        mergeSortParallel0(left).zip(mergeSortParallel0(right)).map{
            case (sortedLeft, sortedRight) => merge(sortedLeft, sortedRight)
        }
    }
}

【问题讨论】:

    标签: scala concurrency


    【解决方案1】:

    flatMapmap 是 Scala Future 上的顺序操作,它们本身与并行运行无关。它们可以被视为 Future 完成时执行的简单回调。或者换句话说,map(...)flatMap(...) 中提供的代码只有在前一个 Future 完成后才会开始执行。

    另一方面,zip 将并行运行您的 Futures,并在它们都完成时将结果作为元组返回。同样,您可以使用zipWith,它采用一个函数来转换两个 Futures 的结果(结合 zip 和 map 操作):

          mergeSortParallel0(left).zipWith(mergeSortParallel0(right)){
            case (sortedLeft, sortedRight) => merge(sortedLeft, sortedRight)
          }
    

    实现并行性的另一种方法是在理解之外声明 Futures。这适用于 Scala 中的 Futures 是“渴望的”,并且在您声明它们时它们会立即启动(分配给 val):

      def mergeSortParallel0[T: Ordering](items: IndexedSeq[T]): Future[IndexedSeq[T]] = {
        if (items.length <= 16) Future.successful(mergeSortSequential(items))
        else {
          val (left, right) = items.splitAt(items.length / 2)
          val leftF = mergeSortParallel0(left)
          val rightF = mergeSortParallel0(right)
    
          for {
            sortedLeft <- leftF
            sortedRight <- rightF
          } yield {
            merge(sortedLeft, sortedRight)
          }
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-12
      • 2011-10-05
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多