我有一些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优雅旁边感觉相当懦弱。
答案 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))