それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Rubyでマルチスレッド その8 # Thread per Message

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も使えるなぁ。

スレッドの動作順序

制御できない。起動順は制御できるけど・・・