アクターモデル

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のほうが洗練されている印象でした。