【发布时间】:2018-09-30 04:26:47
【问题描述】:
我知道我可以通过将Seq[Future[T]] 转换为Future[Seq[T]]
val seqFuture = Future.sequence(seqOfFutures)
seqFuture.map((seqT: Seq[T]) => {...})
我现在的问题是,我在该序列中有 700 个期货,我希望能够控制其中有多少是并行解决的,因为每个期货将调用内部休息 api,并同时有 700 个请求就像对那个服务器发起一个dos攻击。
我宁愿一次只解决 10 个未来。
我怎样才能做到这一点?
尝试pamu's answer我看到错误:
[error] /home/philipp/src/bluebat/src/main/scala/com/dreamlines/metronome/service/JobFetcher.scala:32:44: com.dreamlines.commons.LazyFuture[A] does not take parameters
[error] val batch = Future.sequence(c.map(_()))
[error] ^
[error] /home/philipp/src/bluebat/src/main/scala/com/dreamlines/metronome/service/JobFetcher.scala:32:28: no type parameters for method sequence: (in: M[scala.concurrent.Future[A]])(implicit cbf: scala.collection.generic.CanBuildFrom[M[scala.concurrent.Future[A]],A,M[A]], implicit executor: scala.concurrent.ExecutionContext)scala.concurrent.Future[M[A]] exist so that it can be applied to arguments (List[Nothing])
[error] --- because ---
[error] argument expression's type is not compatible with formal parameter type;
[error] found : List[Nothing]
[error] required: ?M[scala.concurrent.Future[?A]]
[error] val batch = Future.sequence(c.map(_()))
[error] ^
[error] /home/philipp/src/bluebat/src/main/scala/com/dreamlines/metronome/service/JobFetcher.scala:32:42: type mismatch;
[error] found : List[Nothing]
[error] required: M[scala.concurrent.Future[A]]
[error] val batch = Future.sequence(c.map(_()))
[error] ^
[error] /home/philipp/src/bluebat/src/main/scala/com/dreamlines/metronome/service/JobFetcher.scala:32:36: Cannot construct a collection of type M[A] with elements of type A based on a collection of type M[scala.concurrent.Future[A]].
[error] val batch = Future.sequence(c.map(_()))
[error] ^
[error] four errors found
【问题讨论】:
-
看看如何使用异步 HTTP 客户端 (Play WS) 限制请求速率。同样可以应用于 Akka Http Client:stackoverflow.com/questions/37259206/…
标签: scala asynchronous concurrency future