Drain a prefilled queue with nonblocking pops and report whether work was left idle, fully drained, or the drain ran short.

Queue Drain Coordination Report

queue_drain_coordination_report.rb
requests = 
queue = Queue.new
queue.push("job1")
queue.push("job2")
drained = 0
short = 0

requests.times do
  begin
    queue.pop(true)
    drained += 1
  rescue ThreadError
    short += 1
  end
end

remaining = queue.size

status = if remaining > 0
  "idle"
elsif short > 0
  "short"
else
  "drained"
end

puts "requests=#{requests}"
puts "drained=#{drained}"
puts "remaining=#{remaining}"
puts "status=#{status}"
requests = 
queue = Queue.new
queue.push("job1")
queue.push("job2")
drained = 0
short = 0

requests.times do
  begin
    queue.pop(true)
    drained += 1
  rescue ThreadError
    short += 1
  end
end

remaining = queue.size

status = if remaining > 0
  "idle"
elsif short > 0
  "short"
else
  "drained"
end

puts "requests=#{requests}"
puts "drained=#{drained}"
puts "remaining=#{remaining}"
puts "status=#{status}"
requests = 
queue = Queue.new
queue.push("job1")
queue.push("job2")
drained = 0
short = 0

requests.times do
  begin
    queue.pop(true)
    drained += 1
  rescue ThreadError
    short += 1
  end
end

remaining = queue.size

status = if remaining > 0
  "idle"
elsif short > 0
  "short"
else
  "drained"
end

puts "requests=#{requests}"
puts "drained=#{drained}"
puts "remaining=#{remaining}"
puts "status=#{status}"
nonblocking pop `Queue#pop(true)` removes a buffered item without waiting and raises `ThreadError` when the queue is empty, so counting successful pops against requested pops coordinates a consumer with the work that was actually queued.