Package workqueue provides a simple queue that supports the following
features:
Fair: items processed in the order in which they are added.
Stingy: a single item will not be processed multiple times concurrently,
and if an item is added multiple times before it can be processed, it
will only be processed once.
Multiple consumers and producers. In particular, it is allowed for an
item to be reenqueued while it is being processed.
Done marks item as done processing, and if it has been marked as dirty again
while it was being processed, it will be re-added to the queue for
re-processing.
Get blocks until it can return an item to be processed. If shutdown = true,
the caller should end their goroutine. You must call Done with item when you
have finished processing it.
Len returns the current queue length, for informational purposes only. You
shouldn't e.g. gate a call to Add() or Get() on Len() being a particular
value, that can't be synchronized properly.
Shutdown will cause q to ignore all new items added to it. As soon as the
worker goroutines have drained the existing items in the queue, they will be
instructed to exit.