【问题标题】:Running scala futures somewhat in parallel并行运行 scala 期货
【发布时间】:2015-08-25 03:06:36
【问题描述】:

我有一些 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 惯用方式?那么对于额外的实用程序,在例程中实现终止开关的最优雅的方法是什么?我可以即时更改m 吗?

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

【问题讨论】:

    标签: scala parallel-processing future


    【解决方案1】:

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

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

    【讨论】:

    • 对,ExecutionContext 肯定很简单,但你真的是要在serFut 上使用它吗?那只是为了一次运行一个未来。你不是要在Future.sequence 上使用它吗?另外,对于ExecutionContext,是否可以在期货已经运行时上下调节m? JVM 使用线程池的方式对我来说是不可见的,所以我无法真正看到发生了什么。我一直希望有一个我可以理解并根据需要修改的 scala 函数。
    • 关于 Futures 的重要一点是你应该停止考虑线程。它是具有某些属性的抽象。在编写代码时,您唯一应该关心的是未来最终会被执行,并且您可以将其他未来与它链接起来。如果您确实需要对线程进行低级控制,请继续创建线程。
    【解决方案2】:

    最简单的方法是定义你的 ExecutionContext 像

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 2013-04-27
      • 2018-08-04
      • 1970-01-01
      • 2017-10-24
      • 2015-03-10
      • 2018-01-25
      相关资源
      最近更新 更多