Rubyで結城浩せんせいのJavaマルチスレッド本 その9 thread per message
Thread per Message
メインスレッドがTask毎に別スレッドを作って投げる。スレッドを作っては捨てる。スレッドは再利用されない。
Rubyで書いてみた。
Javaと違って匿名クラスの替わりにブロックが使えるので応用範囲はとてつもなく広い。Rubyのスレッドで一番書きやすい
#!/usr/bin/env ruby # Thread per Message をやる class Helper def handle count, str puts " handle ( #{count}, #{str} ) BEGIN" puts (1..count).map{self.slowly;str}.join end def slowly sleep 0.1 end end class Host def initialize @helper = Helper.new end def request count, str puts " request ( #{count}, #{str} ) BEGIN" t= Thread.new{ @helper.handle count, str } puts " request ( #{count}, #{str} ) END" t end end puts "main BEGIN" host = Host.new threads =[ host.request(10, "A"), host.request(20, "B"), host.request(30, "C"), ] puts "main END" # 作り捨てたスレッドを待つ threads.each{|t| t.join}
タスクが1000万件
クローラーとかでタスクが1000万件とかある場合。スレッド起動は速く、1000万スレッドを起動してしまう。つまりスレッド作りすぎて重い。。。スレッドを再利用するにはWorker-Thread(Thread-Pool)を利用する。
メインスレッドの応答性
メインスレッドの応答性を上げることが目的です。スレッドを起動する事じゃないです。タスクベースだ。
スレッドの結果が必要か?
別スレッドに任せた処理の結果や状況を知りたいときは、Futureを使うなど。Queueも使えるなぁ。
スレッドの動作順序
制御できない。起動順は制御できるけど・・・