同时运行scala期货

时间:2015-06-10 03:28:05

标签: scala parallel-processing future

我有一些scala期货。我可以轻松地与Future.sequence并行运行它们。我也可以用这样的东西一个接一个地运行它们:

def serFut[A, B](l: Iterable[A])(fn: A ⇒ Future[B]) : Future[List[B]] =
  l.foldLeft(Future(List.empty[B])) {
    (previousFuture, next) ⇒
      for {
        previousResults ← previousFuture
        next ← fn(next)
      } yield previousResults :+ next
  }

(描述here)。现在假设我想并行地运行它们轻微 - 即使用约束它们最多m一次运行。上面的代码针对m=1的特殊情况执行此操作。对于一般m,是否有一种很好的scala-idiomatic方法?那么对于额外的实用程序,在例程中实现kill-switch的最优雅的方法是什么?我可以动态更改m吗?

我自己的解决方案让我回到程序代码,在scala优雅旁边感觉相当懦弱。

2 个答案:

答案 0 :(得分:3)

您可以使用ExecutionContext来使用最大m个线程池来实现它: How to configure a fine tuned thread pool for futures?

implicit val ec = new ExecutionContext { ...置于serFut函数范围内的某处,以便在创建期货时使用它。

答案 1 :(得分:3)

最简单的方法是定义您的ExecutionContext,如

implicit val ec = ExecutionContext.fromExecutor(Executors.newFixedThreadPool(m))