Concurrency Basics
Timeout Guard
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
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}"
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"14endstatus ← finished
7begin8 Timeout.timeout(limit0.05) do9 sleep(work_time0.02)10 status = "finished"11 end12rescue Timeout::ErrorTimeout::Error13 status→ finished = "timed_out"14endputs "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
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"14endstatus ← 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"14endputs "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
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"14endstatus ← finished
7begin8 Timeout.timeout(limit0.1) do9 sleep(work_time0.02)10 status = "finished"11 end12rescue Timeout::ErrorTimeout::Error13 status→ finished = "timed_out"14endputs "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