期货发送并发HTTP GET请求
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了期货发送并发HTTP GET请求相关的知识,希望对你有一定的参考价值。
假设我正在编写一个函数来发送一些并发的HTTP GET请求,并等待所有响应超时。如果至少有一个响应没有状态200
或者没有超时,我的函数应该返回失败。
我正在写这个函数tryGets
像这样:
import java.net.URL
import scala.concurrent.duration._
import scala.concurrent.{Await, ExecutionContext, Future}
import scala.util.Try
def unsafeGet(url: URL): String = {
val in = url.openStream()
scala.io.Source.fromInputStream(in).mkString
}
def futureGet(url: URL)
(implicit ec: ExecutionContext): Future[String] = Future {
unsafeGet(url)
}
def tryGets(urls: Seq[URL], timeOut: Duration)
(implicit ec: ExecutionContext): Try[Seq[String]] = Try {
val fut = Future.sequence(urls.map(futureGet))
Await.result(fut, timeOut)
}
是否有意义 ?在超时的情况下,它是否会泄漏未来的实例?
答案
如果Future的其中一个超时,那么Future的剩余部分将继续执行,因为未来的渴望并将继续在执行环境中运行。您可以做的是折叠Urls,但这将连续执行它们。
urls.foldleft(Future.sucessful(Seq.empty)) { (future, url) =>
future.flatMap(accum => futureGet(url).map(accum :+ _))
}
以上是关于期货发送并发HTTP GET请求的主要内容,如果未能解决你的问题,请参考以下文章