我有一段代码,用于向一组演员发送广播消息并收集他们的响应。请看下面的简化代码:
{
val responses: Set[Future[T] = // ask a set of actors
val zeroResult: T
val foldResults: (T, T) => T
//1. Future.fold(responses)(zeroResult)(foldResults)
//2. (future(zeroResult) /: responses) { (acc, f) => for { x <- f; xs <- acc } yield foldResults(x, xs) }
} foreach {
client ! resp(_)
}
然后我注意到代码行1和2的行为有所不同。例如,有4个actor将Traversable(1)作为响应发送,并且
zeroResult = Traversable.empty[Int]
foldResults = { _ ++ _ }
第一行的结果是不同的:通常我会得到List(1, 1, 1, 1),但有时会得到List(1, 1, 1),甚至是List(1, 1)。这对我来说并不奇怪,因为Future.fold是非阻塞的,所以可能会丢失一些响应。
但第二行总是产生四个一的列表。
有人能解释一下这些fold之间的差异以及哪种更可取吗?