Fork-Joinパターン。
大量の処理が必要な問題をFork(分割)して並列処理させ、
実行結果を後でJoin(結合)させる。
JavaのFork-Joinフレームワーク
http://gee.cs.oswego.edu/dl/papers/fj.pdf
はJDK 7に標準で組み込まれる予定。
futureパターンを使って例を書いてみた。
100から200までの数字からなるリストを生成し、
そのリストを半分で分割して並列に処理させて素数のものを得、最後に結合する。
import scala.actors.Futures._実行結果:object Main {
// 素数か否か
def isPrime(n: Int) = List.range(2, n) forall (x => n % x != 0)def main(args: Array[String]) = {
val list = (100 to 200).toList
val (left, right) = list.splitAt(list.length / 2)val leftFork = future(left.filter(isPrime(_)))
val rightFork = future(right.filter(isPrime(_)))
val join = leftFork() ::: rightFork()
println(join)
}
}
List(101, 103, 107, 109, 113, 127, 131, 137, 139, 149,
151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199)
実際に素数を求めるときはこんなやり方では効率が悪いけど。