像未来一样——并行还是并发?

Akka Future - Parallel versus Concurrent?

来自写得很好的Akka Concurrency:

根据我的理解,图表指出,numSummercharConcat 都将 运行 在同一个线程上。

是否可以 运行 每个 Future 并行,即在单独的线程上?

左图他们运行并列的

插图的要点是 Future.apply 方法是开始执行的方法,所以如果直到第一个 future 的结果被 flatMaped 才发生(如图所示)在右边),那么你就不会得到并行执行。

(请注意 "kicked off",我的意思是相关的 ExecutionContext 被告知有关该工作的信息。it 如何并行化是一个不同的问题,可能取决于关于它的线程池的大小。)

左边的等效代码:

val numSummer = Future { ... }  // execution kicked off
val charConcat = Future { ... }  // execution kicked off
numSummer.flatMap { numsum =>
  charConcat.map { string =>
    (numsum, string)
  }
}

右边:

Future { ... }  // execution kicked off
  .flatMap { numsum =>
    Future { ... }  // execution kicked off (Note that this does not happen until
                    // the first future's result (`numsum`) is available.)
      .map { string =>
        (numsum, string)
      }
  }