3

最大で一定時間実行される Ruby (MRI 1.9.3) ループを作成しようとしています。その時間が経過すると、ループの次の反復に進みます。

たとえば、これは私が達成したいと思っていることです:

timer = Timer.new
while foo
  timer.after 5 do # The loop on foo only gets to run for 5 seconds
    next
  end

  # Do some work here
end

これまでのところ、上記のコードでエミュレートしようとしているタイマー ( https://github.com/tarcieri/timers )と呼ばれる tarcieri の gem を見つけましたが、私の実装では期待どおりの動作が得られません。これは、私の作業がそれよりも長くかかる場合、ループが 5 秒後に次の反復に進むためのものです。何か案は?

4

3 に答える 3

12
require 'timeout'
timeout_in_seconds = 5
while foo
  begin
    Timeout.timeout(timeout_in_seconds) do
      # Do some work here
    end
  rescue Timeout::Error
    next
  end
end
于 2012-08-28T14:49:52.387 に答える
2

Ruby のスキルを磨いてからしばらく経ちましたが、これはタイムアウト ライブラリを使用して実行できると思います。

require 'timeout'

while foo
    Timeout.timeout(5) do
        work()
    end
end
于 2012-08-28T14:50:51.463 に答える
0

これを試すこともできます:

time = 60
time_start = Time.now
begin      
      time_running = Time.now - time_start
      #You_code_goes_here
end until (time_running.to_i >= time)

そのループは、time_runningvar が「60」以上になるまで発生します。

于 2016-06-10T22:44:50.747 に答える