Akkaの勉強をやってみる 2
うん、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 更新。多分設定ファイルの読み込みは↑は間違ってる