当我想要在同一输入上调用几个昂贵的操作然后收集结果时,我可以使用Scala的并行集合吗?

pr1*_*001 3 scala parallel-collections

我发现了一个类似的问题,但它有一个似乎更简单的情况,昂贵的操作始终是相同的.就我而言,我想收集一些我希望并行执行的昂贵API调用的结果.

说我有:

def apiRequest1(q: Query): Option[Result]
def apiRequest2(q: Query): Option[Result]
Run Code Online (Sandbox Code Playgroud)

哪里q是相同的值.

我想要一个List[Result]或类似的(显然List[Option[Result]]很好),我希望两个昂贵的操作并行发生.

当然,一个简单的List构造函数不会并行执行:

List(apiRequest1(q), apiRequest2(q))
Run Code Online (Sandbox Code Playgroud)

并行集合可以帮助吗?或者我应该期待未来等?我可以想到使用并行集合的唯一方法似乎很简单:

 List(q, q).par.zipWithIndex.flatMap((q) =>
   if (q._2 % 2 == 0) apiRequest1(q._1) else apiRequest2(q._1)
 )
Run Code Online (Sandbox Code Playgroud)

实际上,所有事情都是平等的,也许这并不是那么糟糕......

Deb*_*ski 14

你为什么不写

List(apiRequest1 _, apiRequest2 _).par.map(_(q))
Run Code Online (Sandbox Code Playgroud)