我目前正在编写代码以扩展Future随播对象。我想要实现的一个功能是Any
//returns the future that computes the first value computed from the list. If the first one fails, fail.
def any[T](fs: List[Future[T]]): Future[T] = {
val p = Promise[T]()
fs foreach { f => {
f onComplete {
case Success(v) => p trySuccess v
case Failure(e) => p tryFailure e
}
} }
p.future
}
我尝试用
测试我的代码 test("A list of Futures return only the first computed value") {
val nums = (0 until 10).toList
val futures =
nums map { n => Future { Thread.sleep(n*1000); n } }
val v = Await.result(Future.any(futures), Duration.Inf)
assert(v === 0)
}
但是返回的值是1,而不是0.当我将睡眠时间切换到n*1000
到(n+1)*1000
时,它工作正常(返回0)。
在0上调用睡眠时是否有任何特殊效果?
答案 0 :(得分:1)
Thread.sleep
是Future
中的阻止操作,但您没有发信号通知ExecutionContext
您正在执行此操作,因此行为会因您使用的ExecutionContext以及操作方式而异你的机器有很多处理器。如果添加blocking
:
ExecutionContext.global
nums map { n => Future { blocking { Thread.sleep(n*1000); n } } }
答案 1 :(得分:0)
我认为函数名称是any
所以我认为你正确地实现了any
。
但是如果你想要第一个,你只需从List参数fs
获得第一个元素并完成一个诺言。