アクターモデル
Erlang Land
を読んでErlangを学んだ。
Erlangの並列処理を学ぶことでアクターモデルの理解ができた!
概念的に理解できてなかったScalaのActorライブラリも読み書きができるようになりました。
Erlangの並列版フィボナッチをScalaで書いてみました。
import scala.actors._ class FibActor(var name:String) extends Actor { def act = { receive { case i:Int => println(name + ": " + fib(i)) } } def fib(n:Int):Int = { n match { case 0 => 1 case 1 => 1 case _ => fib(n - 1) + fib(n - 2) } } } object ActorTest { def main(arg:Array[String]) = { var l = List(40,5,10,20,42,41,30) for (n <- l) { var f = new FibActor("fib[" + n + "]") f.start f ! n } } }
DualCore等の場合にこれを実行してCPU使用率を眺めていると、並列処理をしていることがよくわかります。
動作
var f = new FibActor("fib[" + n + "]") f.start
ここでプロセスが生成され、actメソッド内にあるようにreceive状態になる(メッセージが送られてくるのを監視)
f ! n
ここで生成されたプロセス「f」に対して「n」というメッセージを送る
receive { case i:Int => println(name + ": " + fib(i)) }
そしてプロセス「f」はreceiveして送られた「n」をもとにフィボナッチ数列を計算し出力します
Threadと違ってメモリを共有せず、メッセージの送受信で動作する為、かなり簡単な感じです
すげーおもしろい
Scalaには簡単にactorを実装できるactorブロックがあったり、他にも関連ライブラリがあるので
探ってみようと思います。
しかし、並列処理はErlangのほうが洗練されている印象でした。