Rails厨がtimeout()を使うときに注意すべきこと

最近のRailsは1.daysとか3.minitusなどといった便利メソッドが、Fixnumでなく、ActiveSupport::Durationを返すようになっています。みなさんも便利に使っていると思いますが、これをtimeout()と組み合わせるとひどい目に遭うので注意してください。

# ダメな例
timeout(5.seconds) do
  sleep 10
  puts "10秒たったんですケド"
end
# => 10秒たったんですケド

これはタイムアウトが効きません。めんどうがらずに#to_iしてから使いましょう。

timeout(5.seconds.to_i) do
  sleep 10
  puts "10秒たったんですケド"
end
# => Timeout::Error起こる

原因も分かったので、しかるべきところに相談しようと思うのですが、ちょっと帯域が埋まっていて動けそうにないので速報まで。

2010-04-19 追記

報告しました。
http://redmine.ruby-lang.org/issues/show/3170