Files
HASUMI Hitoshi 458078f10e Introduce Task::Queue
- This patch implements `Task::Queue` mirroring `Thread::Queue` in CRuby.
- Producer/Consumer pattern is now possible with no polling

## No Top-level pollution
- No top-level `Queue` defined
- No `TaskError`. Instead, `Task::Error` happens when `Task::Queue#pop(true)` when empty
- No `ClosedQueueError`. `Task::Error` also happens when pushing to closed queue

## Future Work
- `Task::SizedQueue`
2026-05-18 14:23:42 +09:00

55 lines
1.1 KiB
Ruby

# Task::Queue Example
# Demonstrates producer/consumer coordination using Task::Queue.
# No polling required - consumers block until items are available.
puts "=== Task::Queue Producer/Consumer Demo ==="
puts
TOTAL_ITEMS = 10
q = Task::Queue.new
produced = 0
consumed = 0
producer = Task.new(name: "producer") do
TOTAL_ITEMS.times do |i|
item = "item-#{i}"
q.push(item)
produced += 1
puts "Producer: pushed #{item}"
sleep 0.1
end
q.close
puts "Producer: closed queue after #{produced} items"
end
consumer1 = Task.new(name: "consumer-1") do
loop do
item = q.pop # blocks until an item is available or queue closes
break if item.nil?
consumed += 1
puts "Consumer-1: got #{item}"
sleep 0.15
end
puts "Consumer-1: done"
end
consumer2 = Task.new(name: "consumer-2") do
loop do
item = q.pop
break if item.nil?
consumed += 1
puts "Consumer-2: got #{item}"
sleep 0.2
end
puts "Consumer-2: done"
end
Task.run
puts
puts "=== Summary ==="
puts "Produced: #{produced}"
puts "Consumed: #{consumed}"
puts "Queue size: #{q.size}"
puts "Queue closed: #{q.closed?}"