class Async::PriorityQueue
def dequeue(priority: 0, timeout: nil)
@parameter timeout [Numeric, nil] Maximum time to wait for an item. If nil, waits indefinitely. If 0, returns immediately.
@parameter priority [Numeric] The priority of this consumer (higher = served first).
items first.
Fibers are served in priority order, with higher priority fibers receiving
If the queue is empty, this method will block until an item is available or timeout expires.
Remove and return the next item from the queue.
def dequeue(priority: 0, timeout: nil) @mutex.synchronize do # If queue is closed and empty, return nil immediately: if @closed && @items.empty? return nil end # Fast path: if items available and either no waiters or we have higher priority: unless @items.empty? head = @waiting.peek if head.nil? or priority > head.priority return @items.shift end end # Handle immediate timeout (non-blocking) return nil if timeout == 0 # Need to wait - create our own condition variable and add to waiting queue: sequence = @sequence @sequence += 1 condition = ConditionVariable.new begin waiter = Waiter.new(Fiber.current, priority, sequence, condition, nil) @waiting.push(waiter) # Wait for our specific condition variable to be signaled: return waiter.wait_for_value(@mutex, timeout) ensure waiter&.invalidate! end end end