我发现了一个类似的问题,但它似乎有一个更简单的情况,其中昂贵的操作总是相同的。就我而言,我想收集一组我想并行执行的昂贵 API 调用的结果。
说我有:
def apiRequest1(q: Query): Option[Result]
def apiRequest2(q: Query): Option[Result]
哪里q
是相同的值。
我想要一个List[Result]
或类似的(显然List[Option[Result]]
很好),我希望这两个昂贵的操作并行发生。
自然,一个简单的List
构造函数不会并行执行:
List(apiRequest1(q), apiRequest2(q))
并行集合可以提供帮助吗?还是我应该寻找期货之类的东西?我能想到的使用并行集合的唯一方法似乎很老套:
List(q, q).par.zipWithIndex.flatMap((q) =>
if (q._2 % 2 == 0) apiRequest1(q._1) else apiRequest2(q._1)
)
其实,万事俱备,或许也不是那么糟糕……