Я нашел похожий вопрос , но он имеет, как кажется, более простой случай, когда дорогостоящая операция всегда одинакова.В моем случае я хочу собрать набор результатов некоторых дорогих вызовов 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)
)
На самом деле, при прочих равных условиях, может быть, это не так уж и плохо ...