Rubyにはtimeoutというライブラリがありますが、これを使わずにThreadだけでtimeout処理を実装してみます。
コード
# timeout_using_thread.rb
wait = ARGV[0].to_f
limit = ARGV[1].to_f
puts "wait:#{wait}"
puts "limit:#{limit}"
t = Thread.new do
Thread.pass
t = Thread.new do
sleep wait
end
begin
t.join limit
rescue Exception => e
# 例外処理
false
else
res = t.alive?
t.kill
res
end
end
puts "timeout:#{t.value}"
実行結果
$ ruby timeout_using_thread.rb 0.5 1
wait:0.5
limit:1
timeout:false
$ ruby timeout_using_thread.rb 0.5 0.1
wait:0.5
limit:0.1
timeout:true