当前位置: 首页 > 知识库问答 >
问题:

如何生成未知数量的期货并组合结果,即使一个或多个失败?

松飞翮
2023-03-14

我想将以下顺序代码转换为与Futures的并发代码,并需要有关如何构建它的建议。

顺序:

import java.net.URL

val providers = List(
  new URL("http://www.cnn.com"),
  new URL("http://www.bbc.co.uk"),
  new URL("http://www.othersite.com")
)

def download(urls: URL*) = urls.flatMap(url => io.Source.fromURL(url).getLines).distinct

val res = download(providers:_*)

我想下载所有通过下载方法的varargs进入的源,并将结果组合到一个Seq/List/Set中,无论如何,在一起。当一个Future失败时,假设因为服务器无法访问,它应该接受所有其他的并继续前进并返回结果unetheless。firstCompletedOf不起作用,因为我需要所有的结果,除了一个由于错误而失败。我想过使用如下Future.sequence,但我无法让它工作。这是我尝试的...

def download(urls: URL*) = Future.sequence {
  urls.map { url =>
    Future {
      io.Source.fromURL(url).getLines
    }
  }
} 

这会产生一个与M_[Future[A_]]不兼容的Seq[Future[Iterator[String]]。

一个Future[Iterator[String]]是我想要的。(我想我返回一个Iterator,因为我需要稍后在Iterator上的重置方法中重用它。)

共有1个答案

虞华彩
2023-03-14

您可以使用并行集合:

import java.net.URL

val providers = List(
  new URL("http://www.cnn.com"),
  new URL("http://www.bbc.co.uk"),
  new URL("http://www.othersite.com")
)

def download(urls: URL*) = urls.par.flatMap(url => {
  Try {
    io.Source.fromURL(url).getLines
  } match {
    case Success(e) => e
    case Failure(_) => Seq()
  }
}).toSeq

val res: Seq[String] = download(providers:_*)

或者如果您想要带有Future的非阻塞版本:

def download(urls: URL*) = Future {
  blocking {
    urls.par.flatMap(url => {
      Try {
        io.Source.fromURL(url).getLines
      } match {
        case Success(e) => e
        case Failure(_) => Seq()
      }
    })
  }
}

val res: Future[Seq[String]] = download(providers:_*)
 类似资料:
  • 我正在使用: Scala 2.10 游戏2.1 目前,我正在使用 类,但我愿意尝试另一个 API。 我很难将多个期货的结果组合成一个列表[(String, String)]。 以下 方法成功地将单个 Future 的结果返回到 HTML 模板: 方法执行 Web 服务 API 调用并返回 Future[play.api.libs.ws.Response]。方法 向 HTML 模板返回 List[(

  • 我使用 并行运行 2 个期货。我想知道在所有情况下哪个成功了,哪个失败了(所有情况都应该运行到完成,并显示结果或失败状态)。目前,我只能检索到综合成功结果 我从这里开始操作,但这还不够,因为我无法获得单个失败时的成功状态,也无法获得两个失败时的失败状态。在Scala未来的理解中,两个失败都是失败的 我试图避免这种混乱: 编辑:另一个版本-这是一个有效的方法吗?

  • 我有索引,其中每个文档都有这样的结构: 我需要计算每个演员对应的电影数量(演员可以在actor_1_name、actor_2_name或actor_3_name字段中) 这3个字段的映射是: 有没有一种方法,我可以聚合的结果,可以结合所有3个演员领域的条款,并给出一个单一的聚合。 目前,我正在为每个actor字段创建单独的聚合,并通过我的JAVA代码将这些不同的聚合合并成一个。 通过创建不同的聚合

  • 给定两个数组,其中数组1包含变量,数组2包含变量的值,我希望得到这两个数组的所有可能组合,例如: 数组可以容纳尽可能多的变量,也可以容纳。 所需输出: 我尝试了一种递归方法: 我希望能够将每一行正确的内容保存为中的一个元素,但首先我想知道如何正确打印每一行。 编辑:第二个数组不是常量,它在每个变量之间不同: 显然,这在递归中行不通,因为我需要将每个数组与变量数组一起发送,我通过创建一个对象来实现这

  • 问题内容: 在elasticsearch中,如果我有带有 属性的文档说,还有其他一些属性。 我需要以以下方式查询结果 基本上,我需要doc_count可用的所有组合。使用该结果,可以说 在Foo = foo1,Bar = bar1,Baz = baz1,Qux = qux1的情况下,有20个文档/记录。 粗略的方法是,在聚合内部使用聚合(在这种情况下为4次)。 应该有一些更简单的方法可以做到这一点

  • 题目描述 希望将上面数组用js转化成下面格式,请问如何实现呢