Skip to content

Instantly share code, notes, and snippets.

@agibralter
Created August 31, 2010 05:30
Show Gist options
  • Save agibralter/558595 to your computer and use it in GitHub Desktop.
Save agibralter/558595 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'system_timer'
def try_for_a_bit
result = nil
e_last = nil
begin
SystemTimer.timeout_after(2) do
until result
begin
return result if (result = yield) && !result.respond_to?(:empty?) || !result.empty?
rescue Exception => e_last
end
sleep 0.1
end
end
rescue Timeout::Error => e
raise e_last || e
end
end
try_for_a_bit { nil } #=> sometimes Timeout::Error... sometimes infinite loop.
try_for_a_bit { raise "test" } #=> RuntimeError: test
try_for_a_bit { sleep 5; raise "test" } #=> infinite loop?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment