scala - 在 Future.sequence 的成功上的片状

标签 scala sequence future intermittent

我写了这个方法:

import scala.concurrent._
import ExecutionContext.Implicits.global
import scala.util.{ Success, Failure }

object FuturesSequence extends App {
  val f1 = future {
    1
  }

  val f2 = future {
    2
  }

  val lf = List(f1, f2)

  val seq = Future.sequence(lf)

  seq.onSuccess {
    case l => println(l)
  }
}

我期待 Future.sequence 将 List[Future] 收集到 Future[List] 中,然后等待每个 future (在我的情况下为 f1 和 f2)完成,然后在我的情况下对 Future[List] seq 调用 onSuccess。

但是在多次运行此代码后,它只会偶尔打印一次“List(1, 2)”,我无法弄清楚为什么它没有按预期工作。

最佳答案

试试这个,

import scala.concurrent._
import java.util.concurrent.Executors
import scala.util.{ Success, Failure }

object FuturesSequence extends App {
  implicit val exec = ExecutionContext.fromExecutor(Executors.newCachedThreadPool)
  val f1 = future {
    1
  }

  val f2 = future {
    2
  }

  val lf = List(f1, f2)

  val seq = Future.sequence(lf)

  seq.onSuccess {
    case l => println(l)
  }
}

这将始终打印 List(1,2) .原因很简单,exec上面是一个线程(不是守护线程)的 ExecutionContext,在你的例子中,ExecutionContext 是默认的,它是从 ExecutionContext.Implicits.global 中隐式获取的。其中包含守护线程。

因此作为守护进程,进程不会等待 seq future 完成并终止。如果有的话 seq确实完成然后打印。但这并不总是发生

关于scala - 在 Future.sequence 的成功上的片状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28078033/

相关文章:

scala - 如何为每个用户或系统范围配置 Ivy 缓存目录?

r - 如何防止 TraMineR 状态分布图 (seqdplot) 删除缺失状态

dart - flutter/Dart 异步不等待

c++ - std::future::wait_for 虚假唤醒?

ruby - 在 Scala 中查找 'tidy numbers'

scala - Akka http 连接池

scala - Spark 广播错误 : exceeds spark. akka.frameSize 考虑使用广播

performance - 手指树(Data.Sequence)与绳索(Data.Rope)(Haskell,或一般情况下)

algorithm - 如何生成匹配模式的数字序列?

c++ - 并行运行时采用迭代器对的函数不起作用