RubyのThreadとforkについて
スレッドについてもうすこし調べてみました。
thread_list = Array.new
2.times do |i|
thread_list << Thread.new(i) do |m|
1000000.times do |a|
if a % 200000 == 0
if m == 0
puts "one"
else
puts " two"
end
end
end
end
end
thread_list.each {|t| t.join}
1000000.times do |a|
if a % 200000 == 0
puts " three"
end
end
puts "--end--"
これの結果は
one
two
one
two
one
two
one
two
one
two
three
three
three
three
three
--end--
joinで子スレッドが終了するのを待っていますね。これでは更新pingの速度も劇的に速くなるとはちょっと言いがたい。
ちなみにスレッド内の例外を処理したいときは、スレッド単位でrescueして安心してはいけなくて、なぜかといえばjoinで待っているスレッドでも例外が発生するからなのです。なので注意が必要です。
thread_list = Array.new
begin
2.times do |i|
thread_list << Thread.new(i) do |m|
1000000.times do |a|
if a % 200000 == 0
if m == 0
puts "one"
else
puts " two"
end
end
raise "test e"
end
end
end
thread_list.each {|t| t.join}
rescue
p $!
end
1000000.times do |a|
if a % 200000 == 0
puts " three"
end
end
puts "--end--"
結果は
one
two
#<RuntimeError: test e>
three
three
three
three
three
--end--
こんな感じ。
さらに子プロセスでやってみる。
fork do
2.times do |m|
1000000.times do |a|
if a % 200000 == 0
if m == 0
puts "one"
else
puts " two"
end
end
end
end
end
1000000.times do |a|
if a % 200000 == 0
puts " three"
end
end
puts "--end--"
結果は
one
three
three
three
three
three
--end--
[tsukasa@] $ one [~/lesson]
one
one
one
two
two
two
two
two
お、ぼくがやりたかった流れの処理になったようです。よかったよかった。というわけでkaeruspoonもfork doを使って子プロセスを作り、ブログ更新ping送信を発信するという処理にします。
継続とかFiberとかもちょっと調べてみようかな(まだよくわかっていない)。