これ、シングルスレッドだ。パラレルじゃない。Futureを使わないFork-Joinは再チャレンジする(11/8追記)
----------
試しに書いてみた。
pmapの結果型がList[T]だと型チェックエラーでコンパイルできない。
replyすると型情報が消えちまうのか?
パラレルマップの正解はこれとかこれかもしれない。
また今度試す。
import scala.actors.Actor._ def pmap[T](xs: List[T], n: Int)(fun: T => T): List[Any] = { def divide(n: Int, xs: List[T]): List[List[T]] = { val size = xs.size / n def r(ys: List[T], acc: List[List[T]]): List[List[T]] = { if(ys.size < size) (acc.head ::: ys) :: acc.tail else{ val splitted = ys.splitAt(size) r(splitted._2, splitted._1 :: acc) } } r(xs, Nil).reverse } divide(n, xs).map{ l => val a = actor { receive { case _ => reply(l.map(fun(_))) } } a !? "s" } } val l = (1 to 100).toList val result = pmap(l, 4)(_ + 1) println(result)
実行結果
List(List(2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26), List(27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51), List(52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101))
scalaでactor使ってparallel map その2に続く。
No comments:
Post a Comment