Scala:当一些期货超时时,如何收集期货列表的结果?

Scala:当一些期货超时时,如何收集期货列表的结果?,scala,future,scalaz,Scala,Future,Scalaz,我在这种情况下的做法是使用.sequence将F[G[A]]转换为G[F[A]]。然后使用wait.result(列表的未来,超时)获得结果。但是,可能有一项任务需要很长时间和超时。在这种情况下,我仍然希望得到其余的结果(同时并行运行所有任务)。可能吗?怎么做 谢谢那么,您可以将每个等待包装在另一个未来中: import scala.concurrent.{Await, Future} import scala.concurrent.ExecutionContext.Implicits.glob

我在这种情况下的做法是使用
.sequence
F[G[A]]
转换为
G[F[A]]
。然后使用
wait.result(列表的未来,超时)
获得结果。但是,可能有一项任务需要很长时间和超时。在这种情况下,我仍然希望得到其余的结果(同时并行运行所有任务)。可能吗?怎么做


谢谢

那么,您可以将每个
等待
包装在另一个
未来
中:

import scala.concurrent.{Await, Future}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
import scala.util.Success

scala> val s = Seq(Future(1), Future(2), Future { Thread.sleep(2000); 3 })
s: Seq[scala.concurrent.Future[Int]] = List(Future(Success(1)), Future(Success(2)), Future(<not completed>))

scala> val fs = Future.traverse(s)(f => 
         Future(Await.result(f, 1 second)).transform(Success(_)))
fs: scala.concurrent.Future[Seq[scala.util.Try[Int]]] = Future(<not completed>)

scala> Await.result(fs, Duration.Inf)
res2: Seq[scala.util.Try[Int]] = List(Success(1), Success(2), Failure(java.util.concurrent.TimeoutException: Futures timed out after [1 second]))
导入scala.concurrent.{wait,Future}
导入scala.concurrent.ExecutionContext.Implicits.global
导入scala.concurrent.duration_
导入scala.util.Success
scala>vals=Seq(Future(1),Future(2),Future{Thread.sleep(2000);3})
s:Seq[scala.concurrent.Future[Int]=List(Future(Success(1)),Future(Success(2)),Future())
scala>val fs=Future.transverse(s)(f=>
未来(等待结果(f,1秒)).transform(成功()))
fs:scala.concurrent.Future[Seq[scala.util.Try[Int]]]=Future()
scala>Await.result(fs,Duration.Inf)
res2:Seq[scala.util.Try[Int]]=List(成功(1)、成功(2)、失败(java.util.concurrent.TimeoutException:Futures在[1秒]后超时)

我同意@Kolmar的想法。在他的解决方案中,只有
transform()
是Scala 2.12.x版本的新版本,而在2.11.x中,它有一个不同的签名。我试图升级,但遇到了依赖性问题。我找到了使用2.11.x的
回退到
的方法。由于我的
Await.result(f,1秒))
将返回一个
scalaz.Validation[Throwable,T]
,因此它也是这样工作的:

val fs = Future.traverse(s)(f => 
     Future(Await.result(f, 1 second)).fallbackTo(Future(Failure(new TimeoutException())))

我想这可能会有所帮助:@MarkoŠvaljek谢谢你的评论。但我认为这不是问题所在。未来执行不会引发超时异常。您可以对每个未来进行阻塞(顺序执行?)或对未来列表进行阻塞(超时发生在未来之外)。@MarkoŠvaljek我已经取消了要尝试的任务[2;]。