Scala 发送并发HTTP GET请求的未来
假设我正在编写一个函数来发送几个并发的HTTPGET请求,并等待所有响应超时。如果至少有一个响应没有状态Scala 发送并发HTTP GET请求的未来,scala,concurrency,future,resource-leak,Scala,Concurrency,Future,Resource Leak,假设我正在编写一个函数来发送几个并发的HTTPGET请求,并等待所有响应超时。如果至少有一个响应没有状态200或未在超时范围内,则我的函数应返回failure 我正在编写这个函数tryGets如下: import java.net.URL import scala.concurrent.duration._ import scala.concurrent.{Await, ExecutionContext, Future} import scala.util.Try def unsafeGet
200
或未在超时范围内,则我的函数应返回failure
我正在编写这个函数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)
}
这有意义吗?
在超时的情况下,它不会泄漏将来的实例吗?如果将来的某个实例超时,那么未来的其余实例将继续执行,因为将来的实例非常渴望并将继续在执行上下文上运行。您可以做的是折叠URL,但这将以串行方式执行它们
urls.foldleft(Future.sucessful(Seq.empty)) { (future, url) =>
future.flatMap(accum => futureGet(url).map(accum :+ _))
}
你有没有调查过理解力?这是一篇关于如何使用它的好文章:因为理解是按顺序执行的,而不是同时执行的。如果您提前声明,则不会。所以你可以做valx=Future{};对于{结果,这里有一个很好的解释:谢谢。我知道了。一旦我之前实例化了futures,以便理解,它们就会并发运行。