期货发送并发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请求的主要内容,如果未能解决你的问题,请参考以下文章

PHP 使用 Guzzle 执行 HTTP 请求

PHP 使用 Guzzle 执行 HTTP 请求

求教golang中http发送post请求gb2312编码的解决方案

控制衍生期货的数量以产生背压

简单的 Javascript http 请求片段但不起作用

python接口自动化测试三:代码发送HTTP请求