HTTPClient::Timeout
httpclient付属の「HTTPClient::Timeout」を使うと、処理が指定された期間で完了したかチェックして、完了しない場合エラーとする機能を簡単に実現できます。
- 同様の機能を提供する標準添付のライブラリとしてtimeout.rbがありますが、これと比較して以下の点が改善されているとのこと。
- timeout()が呼ばれるごとにスレッドを生成しない。1スレッドですべてのチェックを行う。
- timeoutチェック用スレッド?の起動回数が少ない。
- 別のスレッドを起動してチェックする点は同じなので、
- 「C 言語レベルで実装され、Ruby のスレッドが割り込めない処理には無力」なのは同じ(のはず)。
- また、Thread#criticalを設定してスレッド切り替えを抑制した状態でも利用できません。(ThreadErrorになります。)
- なお、強制キャンセルの仕組みは「Thread#raiseを使って例外を発生させる」方式で、これもtimeout.rbと同じです。
利用例は以下。
require 'rubygems' require 'httpclient' # 2秒で処理が終わらなければエラーにする include HTTPClient::Timeout timeout( 2 ) { sleep 5 }
実行結果です。
/usr/lib/ruby/1.8/timeout.rb:60: execution expired (Timeout::Error) from xxx/httpclient_timeout.rb:6