Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 发送并发HTTP GET请求的未来_Scala_Concurrency_Future_Resource Leak - Fatal编程技术网

Scala 发送并发HTTP GET请求的未来

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

假设我正在编写一个函数来发送几个并发的HTTPGET请求,并等待所有响应超时。如果至少有一个响应没有状态
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,以便理解,它们就会并发运行。