Pages

2011年5月4日水曜日

Actorをさわってみる

最近、システム障害で並列処理について考える機会があった。並列処理といえば、気になっていたscalaのActorについて勉強してみる。
参考にしたサイト
アクターで楽々並行プログラミング
Scalaの平行性を掘り下げる

復習も兼ねて、例にあった簡単なコードをコピーしてみる。
このプログラムでは、文字列を5回しゃべるアクターが2つ立ち上がり、お互いに関係なくしゃべったら終了します。
import scala.actors.Actor   // Actorトレイトをインポート

class Printer(val msg : String) extends Actor { // Actorを継承したPrinterクラス
  def act () { // Actorクラスの場合、act()メソッド必須。これを実行する。
    for(i <- 1 to 5) { // scalaのfor構文
      println(msg)
      Thread.sleep(3)
    }
  }
}

object App { // 実行の主体
  def main (args : Array[String]) {
    (new Printer("abcdefg")).start // Printerクラスをインスタンスにして実行させる 
    (new Printer("hijklmn")).start // Actorではstartメソッドが実行されるとact()が実施される
  }
}
Scalaの"思い出し”をメモ。
  • トレイトは、rubyのモジュールみたいなもの
  • objectはScalaではシングルトンパターンの実装。クラスのインスタンスであり定数ではない。
さて、早速実行してみました。
scala-example$ vim actor_test1.scala     # ソースを作成
scala-example$ scalac actor_test1.scala  # コンパイル
scala-example$ ls -altr                  # クラスファイルが2つ出来ている。
-rw-r--r--   1 baker  staff    276  5  4 15:36 actor_test1.scala
-rw-r--r--   1 baker  staff  14692  5  4 15:38 Printer.class
-rw-r--r--   1 baker  staff   1327  5  4 15:38 Printer$$anonfun$act$1.class
-rw-r--r--   1 baker  staff    604  5  4 15:38 App.class
-rw-r--r--   1 baker  staff    649  5  4 15:38 App$.class
drwxr-xr-x  14 baker  staff    476  5  4 15:56 .
scala-example$ scala -cp . App           # クラスを指定して実行。クラスパスはカレント。
abcdefg
hijklmn
abcdefg
hijklmn
abcdefg
hijklmn
abcdefg
hijklmn
hijklmn
abcdefg
classファイルが複数出来るのは知らなかった。また、この中間ファイルみたいな$$がついたファイルはなんだろう。これを削除すると実行がうまくいかないので、コンパイルされた実態(中間コード)なのかな?

0 件のコメント:

コメントを投稿