読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

Akkaの勉強をやってみる 2

Scala 勉強 Tips

うん、Scala2.10あんま関係ないのでタイトル変更。午後やるって言って遊んじゃった(主にPSO2)ので遅かった。
先ずコードはこんなん

import akka.actor.{Props, Actor, ActorSystem}
import java.util.Date
import org.slf4j.LoggerFactory

class SampleActor extends Actor {

  val logger = LoggerFactory.getLogger("timeLogging")

  def receive = {
    case i:Int => {
      Thread.sleep(500)
      logger.info("Count : %d".format(i))
    }
  }
}

object Sample extends App {
  val logger = LoggerFactory.getLogger("timeLogging")

  // initialize actor
  val system = ActorSystem("sample")
  val actor  = system.actorOf(Props[SampleActor])

  val startTime = new Date().getTime

  (1 to 30).foreach(i => actor ! i)

  val endTime = new Date().getTime

  logger.info("all time : %s".format((endTime - startTime).toString))
  Thread.sleep(30000)
  system.shutdown()
}

Actor は非同期なんでざっくり終了してしまう。

19:18:27.257 [run-main] INFO  timeLogging - all time : 18
19:18:27.744 [sample-akka.actor.default-dispatcher-3] INFO  timeLogging - Count : 1
19:18:28.246 [sample-akka.actor.default-dispatcher-3] INFO  timeLogging - Count : 2
19:18:28.747 [sample-akka.actor.default-dispatcher-3] INFO  timeLogging - Count : 3
19:18:29.247 [sample-akka.actor.default-dispatcher-3] INFO  timeLogging - Count : 4
19:18:29.747 [sample-akka.actor.default-dispatcher-3] INFO  timeLogging - Count : 5
19:18:30.248 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 6
19:18:30.749 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 7
19:18:31.250 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 8
19:18:31.750 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 9
19:18:32.251 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 10
19:18:32.751 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 11
19:18:33.252 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 12
19:18:33.752 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 13
19:18:34.253 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 14
19:18:34.754 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 15
19:18:35.254 [sample-akka.actor.default-dispatcher-3] INFO  timeLogging - Count : 16
19:18:35.755 [sample-akka.actor.default-dispatcher-3] INFO  timeLogging - Count : 17
19:18:36.255 [sample-akka.actor.default-dispatcher-3] INFO  timeLogging - Count : 18
19:18:36.756 [sample-akka.actor.default-dispatcher-3] INFO  timeLogging - Count : 19
19:18:37.256 [sample-akka.actor.default-dispatcher-3] INFO  timeLogging - Count : 20
19:18:37.756 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 21
19:18:38.256 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 22
19:18:38.757 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 23
19:18:39.258 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 24
19:18:39.758 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 25
19:18:40.258 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 26
19:18:40.759 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 27
19:18:41.259 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 28
19:18:41.759 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 29
19:18:42.260 [sample-akka.actor.default-dispatcher-2] INFO  timeLogging - Count : 30
[success] Total time: 33 s, completed 2013/03/24 19:18:57

うん、マルチスレッド動作だ。
やってることを解析して理解してみる。

で、ここまで長々書いておいてやったのがふつうのアクターなので、もちっと凝ってみる。

http://doc.akka.io/docs/akka/2.1.0/general/configuration.html

を見ながら設定の何たるかを眺めてみる。
Actor 時代からの実装として、メッセージを格納するメールボックスがあり、メッセージレシーバを使ってそれを逐次実行していく。
このとき、スレッドプールが同的に割与えられ、処理に使用されるスレッドがどれかは保障されない。

で、この時の挙動を設定ファイルで多少設定変更できるようだ。

akka.conf をクラスパス上に配置して

akka {
    actor {
        deployment {
            /sampleActor {
                router = round-robin
                nr-of-instances = 5
            }
        }
    }
}

さて、とはいえこれで動きが変わるのだとしても実感ないなー(;'∀')

やっぱ基本的な使い方じゃだめか。AkkaInActionをMEAPで購入してきちんと読んでみよう。
座学はツマンナイけど、、、

4/7 更新。多分設定ファイルの読み込みは↑は間違ってる