タイムアウトを行うライブラリ。
timeout(sec) {|i| .... }
timeout(sec, exception_class) {|i| .... } ((<ruby 1.7 feature>))
ブロックを sec 秒の期限付きで実行します。 ブロックの実行時間が制限を過ぎたときは例外 TimeoutError が発生します。 exception_class を指定した場合には TimeoutError の代わりに その例外が発生します。
また sec が nil
のときは制限時間なしで
ブロックを実行します。
timeout による割り込みは Thread によって実現されています。C 言語 レベルで実装され、Ruby のスレッドが割り込めない処理*1に対して timeout は無力です。その処理を Ruby で実装しなおすか C 側で Ruby のスレッドを意識してあげる必要があります。 timeoutの落し穴も参照
*1そのような
ものは実用レベルでは少ないのですが、例をあげると Socket などは
DNSの名前解決に時間がかかった場合割り込めません。
resolv-replace.rb を使用する必要があります