3

同様の質問を見つけましたが、高価な操作が常に同じである、より単純なケースと思われるものがあります。私の場合、並行して実行したい高価な API 呼び出しの一連の結果を収集したいと考えています。

私が持っているとしましょう:

def apiRequest1(q: Query): Option[Result]
def apiRequest2(q: Query): Option[Result]

q同じ値です。

または同様の操作が必要でList[Result](明らかList[Option[Result]]に問題ありません)、2 つの高価な操作を並行して実行したいと考えています。

当然、単純な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)
 )

実際、すべてが同じなら、それほど悪くはないかもしれません...

4

3 に答える 3

14

なぜあなたは書かないのですか

List(apiRequest1 _, apiRequest2 _).par.map(_(q))
于 2011-10-23T21:10:59.340 に答える
2

迅速で汚い解決策:

scala> def apiRequest1(q: Query): Option[Result] = { Thread.sleep(1000); Some(new Result) }
apiRequest1: (q: Query)Option[Result]

scala> def apiRequest2(q: Query): Option[Result] = { Thread.sleep(3000); Some(new Result) }
apiRequest2: (q: Query)Option[Result]

scala> val f = List(() => apiRequest1(q), () => apiRequest2(q)).par.map(_())
f: scala.collection.parallel.immutable.ParSeq[Option[Result]] = ParVector(Some(Result@1f24908), Some(Result@198c0b5))
于 2011-10-23T21:14:43.663 に答える
0

2 つまたは少数の呼び出ししかない場合、実際に並列で機能するかどうかはわかりません。並列化のしきい値があり、非常に小さなコレクションで順次機能する可能性があります。並列化のオーバーヘッド (実行する操作に依存するため、それを知ることはできませんが、コレクション操作にしきい値を設定することは合理的です)。

于 2011-10-24T06:37:41.117 に答える