mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
458078f10e
- 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`
55 lines
1.1 KiB
Ruby
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?}"
|