リストの要素を並列で計算する正しい方法を理解できませんが、要素が (並列で) 計算されていない間はメイン スレッドをブロックします。ユースケース: URL リンクのリストと html ページの単純なパーサーがあります。各ページを並行して解析することで、特定のページから情報を取得するのに必要な時間を短縮し、いくつかの JSON データを含む単純なリストを返します。 .
私が理解しているように、私には2つのオプションがあります:
先物との同時進行
Future でいくつかの JSON データを抽出するメソッドがあります。
def extractData(link: String): Future[JValue] = // some implementation
そして、それをリンクのリストにマップするだけです。そのタイプはList [Future [JValue]]になります。
val res: List[Future[JValue]] = listOfLink.map(extractData)
sequence
このリストをトラバースして に変換する (たとえば、Scalaz または独自の実装から) を呼び出した場合Future[List[JValue]]
、リンクは引き続き順次処理されますが、別のスレッドでは効率が得られず、結果として必要になります。を取得しList[JValue]
ます。
ParSeq で計算してみる
このオプションには、データを抽出するだけの関数があります:
def extractData(link: String): JValue = // some implementation
ただし、今回.par
はコレクションを呼び出します。
val res: ParSeq[JValue] = listOfLinks.map(extractData)
しかし、この方法では、各リンクを順番に解析せずに、ホールリストが計算されない間にメインスレッドをブロックする方法がよくわかりません
Akka に関しては、ここではアクターを使用できないので、Future
またはPar*