A timeout guard turns a slow operation into a handled failure.

timeout guard `Timeout.timeout` raises when a block runs too long, so code can recover instead of waiting forever.

Timeout Guard

limit
timeout_guard.rb
Replay: real traced execution (multi-file project)
require "timeout"

limit = 0.05
work_time = 0.02
status = "pending"

begin
  Timeout.timeout(limit) do
    sleep(work_time)
    status = "finished"
  end
rescue Timeout::Error
  status = "timed_out"
end

puts "limit=#{format('%.2f', limit)}"
puts "work_time=#{format('%.2f', work_time)}"
puts "status=#{status}"
require "timeout"

limit = 0.01
work_time = 0.02
status = "pending"

begin
  Timeout.timeout(limit) do
    sleep(work_time)
    status = "finished"
  end
rescue Timeout::Error
  status = "timed_out"
end

puts "limit=#{format('%.2f', limit)}"
puts "work_time=#{format('%.2f', work_time)}"
puts "status=#{status}"
require "timeout"

limit = 0.10
work_time = 0.02
status = "pending"

begin
  Timeout.timeout(limit) do
    sleep(work_time)
    status = "finished"
  end
rescue Timeout::Error
  status = "timed_out"
end

puts "limit=#{format('%.2f', limit)}"
puts "work_time=#{format('%.2f', work_time)}"
puts "status=#{status}"
  1. limit ← 0.05, work_time ← 0.02, status ← pending

    1require "timeout"23limit→ 0.05 = 0.05  #@limit=0.01, 0.104work_time→ 0.02 = 0.025status→ pending = "pending"67begin8  Timeout.timeout(limit0.05) do9    sleep(work_time)10    status = "finished"11  end12rescue Timeout::ErrorTimeout::Error13  status = "timed_out"14end
  2. status ← finished

    7begin8  Timeout.timeout(limit0.05) do9    sleep(work_time0.02)10    status = "finished"11  end12rescue Timeout::ErrorTimeout::Error13  status→ finished = "timed_out"14end
  3. puts "limit=#{format('%.2f', limit)}"

    16puts "limit=#{format('%.2f', limit)0.05}"17puts "work_time=#{format('%.2f', work_time)0.02}"18puts "status=#{statusfinished}"
    outputlimit=0.05
    work_time=0.02
    status=finished
  1. limit ← 0.01, work_time ← 0.02, status ← pending

    1require "timeout"23limit→ 0.01 = 0.014work_time→ 0.02 = 0.025status→ pending = "pending"67begin8  Timeout.timeout(limit0.01) do9    sleep(work_time)10    status = "finished"11  end12rescue Timeout::ErrorTimeout::Error13  status = "timed_out"14end
  2. status ← timed_out

    7begin8  Timeout.timeout(limit0.01) do9    sleep(work_time0.02)10    status = "finished"11  end12rescue Timeout::ErrorTimeout::Error13  status→ timed_out = "timed_out"14end
  3. puts "limit=#{format('%.2f', limit)}"

    16puts "limit=#{format('%.2f', limit)0.01}"17puts "work_time=#{format('%.2f', work_time)0.02}"18puts "status=#{statustimed_out}"
    outputlimit=0.01
    work_time=0.02
    status=timed_out
  1. limit ← 0.1, work_time ← 0.02, status ← pending

    1require "timeout"23limit→ 0.1 = 0.104work_time→ 0.02 = 0.025status→ pending = "pending"67begin8  Timeout.timeout(limit0.1) do9    sleep(work_time)10    status = "finished"11  end12rescue Timeout::ErrorTimeout::Error13  status = "timed_out"14end
  2. status ← finished

    7begin8  Timeout.timeout(limit0.1) do9    sleep(work_time0.02)10    status = "finished"11  end12rescue Timeout::ErrorTimeout::Error13  status→ finished = "timed_out"14end
  3. puts "limit=#{format('%.2f', limit)}"

    16puts "limit=#{format('%.2f', limit)0.10}"17puts "work_time=#{format('%.2f', work_time)0.02}"18puts "status=#{statusfinished}"
    outputlimit=0.10
    work_time=0.02
    status=finished