Timeout::timeout(1)
たまにタイムアウトが発生するだけですが、1秒以上かかるプロセスに使用しています。そのときは、rescue
毎回さまざまな方法でキャプチャします。これが私のコードのサンプルです:
require 'timeout'
...
begin
status = Timeout::timeout(1) {
open(file_url) do |foo|
feed = RSS::Parser.parse(foo)
some_method_call(arg1, arg2)
#other stuff
end
}
rescue Timeout::Error
Rails.logger.debug "Timeout"
return nil
rescue Exception => ex
Rails.logger.debug "EXCEPTION - #{ex.message}"
return nil
end
同じ入力で遭遇する 3 つのシナリオを次に示します。
- プロセスが完了するまで実行され、60 秒以上かかる
- プロセスがタイムアウトしてハングし、印刷
execution expired
のみdevelopment.log
- プロセスがタイムアウトし、適切にレスキューされ、 に出力
"Timeout"
されdevelopment.log
、返されますnil
なぜこれほど一貫性がないのでしょうか。
アップデート
タイムアウトを 0.0001 秒に減らした後、プロセスは一貫して期待どおりにタイムアウトします。ブロックは 1 秒よりも速く開いていたようで、open(file_url)
ブロック内のすべての処理に 1 秒以上かかったにもかかわらず、ブロックを開くのに 1 秒以上Timeout
かかった場合にのみ、ブロックがトリガーされました。
execution expired
ただし、これは例外を説明しませんでした。これをテストするために、 to をブロックTimeout::timeout(0.0001)
内に移動しました。open
コードは次のようになります。
require 'timeout'
...
begin
open(file_url) do |foo|
status = Timeout::timeout(0.0001) do
begin
feed = RSS::Parser.parse(foo)
some_method_call(arg1, arg2)
#other stuff
rescue Timeout::Error
Rails.logger.debug "Timeout 2"
rescue Exception => ex
Rails.logger.debug "EXCEPTION 2 - #{ex.message}"
end
end
end
rescue Timeout::Error
Rails.logger.debug "Timeout"
return nil
rescue Exception => ex
Rails.logger.debug "EXCEPTION - #{ex.message}"
return nil
end
今、私は一貫して output を受け取っていますEXCEPTION 2 - execution expired
。Timeout::Error
ここで がトリガーされないのはなぜですか?