なんじゃくにっき

プログラミングの話題中心。

Scala de Design Pattern: Thread-Per-Message

 要求毎にスレッドを生成し、作業は別スレッドで行うパターン。
作業を委譲したらすぐに制御は元のスレッドに戻す。
 
要求を行うのがClient、
要求を受けるのをHost、
別スレッドで要求を実行するのをHelperと呼ぶらしい(?)
 
Scalaの場合、要求ごとにActorを生成してやればよい。
 
 
↓の例の場合、
メインスレッドがClient、
HostオブジェクトがHost、
Hostのact内で生成される無名actorがHelper。

import scala.actors._
import Actor._
import java.lang.Thread._

object Main {
object Host extends Actor {
def act() {
loop {
react {
// メッセージを受けたらactorを生成し、出力は新しいactorに任せる
case msg => {
actor {
println("Hello " + msg)
}
}
}
}
}
}

def main(args: Array[String]) = {
Host.start()
Host ! "hoge"
Host ! "huga"
Host ! "piyo"
sleep(10000)
}
}

 
スレッド生成はコストが高いので、printlnのためだけにActorを用いるのは贅沢。
まああくまでサンプルってことで。
 
 
actorの代わりにspawnを使ってもいいかもしれない。
        def act()  {
loop {
react {
// メッセージを受けたらactorを生成し、出力は新しいactorに任せる
case msg => {
spawn {
println("Hello " + msg)
}
}
}
}
}