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.
Download
Copy to clipboard
This is built in (but fairly obscure!). You don't need this - the built in iter() function allows you to do this:
Until I saw this recipe, I'd forgotten about it, though!
Cool! I want to pass arguments to Queue.get as well, so I added:
Now I can
to my heart's desire :-)