期货发送并发HTTP GET请求

时间:2017-12-20 17:27:41

标签: scala concurrency future resource-leak

假设我正在编写一个函数来发送一些并发的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)
}

有意义吗? 如果超时,它不会泄漏未来的实例吗?

1 个答案:

答案 0 :(得分:1)

如果其中一个未来超时,那么未来的其余部分将继续执行,因为未来会非常渴望并将继续在执行环境中运行。您可以做的是折叠Urls,但这将连续执行它们。

std::set<int>