読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

HTTPClient::Timeout

Ruby

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