My Queue usage typically involves a producer thread and a consumer thread. The producer calls queue.put(value) until it's done at which point it calls queue.put(sentinel). My consumers almost always look like this:
while True: value = queue.get() if value != sentinel: # do something with value else: break
That logic can be abstracted away into a generator function that allows consumer code to look like this instead:
for value in iterQueue(queue, sentinel): # do something with value
1 2 3 4 5 6 7 8
def iterQueue(queue, sentinel): """Iterate over the values in queue until sentinel is reached.""" while True: value = queue.get() if value != sentinel: yield value else: return
Generators functions provide a powerful tool for abstracting looping logic into separate functions. This can make code much easier to read.