mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
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`
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
# 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?}"
|
||||
Reference in New Issue
Block a user