なんじゃくにっき

プログラミングの話題中心。

Scala de Design Pattern: Fork-Join

 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) 
 
実際に素数を求めるときはこんなやり方では効率が悪いけど。