2009-04-09 13 views
2

ネットワーク接続でハングアップするライブラリメソッドがあり、タイムアウトメカニズムがありません。ルビーでは、どのようにコードブロックを試しますが、n秒後に移動しますか?

自分自身を追加する最も簡単な方法は何ですか?基本的には、私のコードが無限に滞ってしまうのを防ぐようにしています。 ... を

http://www.ruby-doc.org/stdlib/libdoc/timeout/rdoc/index.html

'タイムアウト' 状態=タイムアウトを要求::タイムアウトを、それはあまりにも多くの時間がかかる場合に中断されなければならない(5){ #何か:

答えて

4

timeout.rbには、基本的には常に正しく動作するとは限りませんが、私はそれを使用することをお勧めしません。 System TimerまたはTerminatorを代わりにチェックしてください

特に、システムタイマーページでは、timeout.rbが失敗して、美しい写真やすべてが完了する理由を説明しています。ボトムラインは、次のとおりです。timeout.rbが機能するために

  • は、新規に作成した「殺人」のRubyスレッドはRubyインタプリタによってスケジュールする必要があります。
  • M.R.I. 1.8では、Rubyアプリケーションを本番環境で使用するインタプリタで、Rubyスレッドを緑のスレッドとして実装しています。
  • 緑色のスレッド(単一のネイティブスレッドの上で実行される)は、緑色のスレッドが基になるオペレーティングシステムへのブロッキングシステムコールを実行すると、仮想マシン内の緑色のスレッドは実行されませんシステムコールが返るまでタイムアウトに醜いエラーを防止するために
4

は自分の質問に回答しました}

0

私はそれを囲むと、このような救助を使用することをお勧め:

begin 
    status = Timeout::timeout(5) do 
     #Some stuff that should be interrupted if it takes too long 
    end  
rescue Timeout::Error 
    puts "Error message: It took too long!\n" 
end 
関連する問題