A fast producer can fill memory while a slower consumer works correctly on every individual item. Bounding the queue makes the producer wait, and completion accounting tells the owner when accepted work has finished. These are service-level correctness rules.
You run a real asyncio queue, compare it with an explicit nonblocking admission model and finish a downstream batching contract. A waiting put and a rejected put are different policies, so each prompt names which one applies. Flush the final short batch. Acknowledge only successful effects, and retain failures for a later retry. The supplied values include zero and empty identifiers because sentinels must be chosen deliberately rather than borrowed from ordinary data.