From: Kyosuke MOROHASHI Date: 2010-04-19T11:01:30+09:00 Subject: [ruby-dev:41011] [Bug #3170] timeout() does'nt work with Non Integer/Float Argument Bug #3170: timeout() does'nt work with Non Integer/Float Argument http://redmine.ruby-lang.org/issues/show/3170 起票者: Kyosuke MOROHASHI ステータス: Open, 優先度: Normal カテゴリ: lib ruby -v: ruby 1.8.7 (2009-12-24 patchlevel 248) [i686-darwin9] Ruby 1.8.7p248で、timeout()の引数にIntegerやFloat以外のオブジェクトを渡すと、 何も起こらないままタイムアウトが効かなくなります。 あまり機会はありませんが、 - Rational(mathnをrequireしたあと、1/2秒など指定すると困る)や、 - ActiveSupport::Duration(10.secondsなどで返る) でタイムアウト秒を指定する場合にはまってしまいます。 原因は、timeout()で作られる監視用スレッドyにて、sleepがTypeErrorを起こし、yがすぐに 終了してしまうのが原因だと思っています。 数値に変換できそうなオブジェクトの場合は、to_i/to_fしてsleepする挙動か、 もしくは明示的に例外があがるようになれば助かりますが、いかがでしょうか。 $ ruby -v -rtimeout -rrational -e 'timeout(Rational(1,2)){ sleep 3; p "slept" }' ruby 1.8.7 (2009-12-24 patchlevel 248) [i686-darwin9] "slept" $ ruby19 -v -rtimeout -rrational -e 'timeout(Rational(1,2)){ sleep 3; p "slept!" }' ruby 1.9.2dev (2009-09-25 trunk 25091) [i386-darwin9] lib/rational.rb is deprecated -e:1:in `sleep': execution expired (Timeout::Error) from -e:1:in `block in
' from -e:1:in `
' ---------------------------------------- http://redmine.ruby-lang.org