Queue: Which form is better/more Pythonic?

Jeff Hinrichs jlh at cox.net
Sat Feb 22 13:27:52 EST 2003


"Alex Martelli" <aleax at aleax.it> wrote in message
news:fOO5a.217413$0v.6083352 at news1.tin.it...
> Jeff Hinrichs wrote:
>
> > Is it better to break out of an infinite loop when the queue is empty
> > while 1:
> >     try:
> >         msg=qMsg.get_nowait()
> >         ...do something with msg...
> >     except Queue.Empty:
> >         break
> >
> > or to loop against the .empty()
> >
> > while not qMsg.empty():
> >     try:
> >         msg=qMsg.get_nowait()
> >         ...do something with msg...
> >     except Queue.Empty:
> >         pass
> >
> > The docs say that .empty() is not reliable and I want to make sure that
I
> > pass all messages from the producer to a consumer. Although my limited
>
> The queue COULD be empty just because the producer isn't finished
> producing yet, and that's a risk you run with either approach (also,
> get_nowait used like this will produce a busy loop chewing up your
> CPU).  I suggest that you should rather have the producer post to
> the queue a special message conventionally meaning "OK, I'm done!"
> and that you break out of your "while 1:" loop when you meet it: this
> is FAR more reliable.  Also, use get, not get_nowait, for performance.
>
> > missing a non-empty queue.  Am I a worrying too much?
>
> No, just, I suspect, worrying about the wrong things.
Very probably as this is my first foray in to using threads in any language.
I am writing small "learning" apps to figure out what I  don't know and
fill those gaps, wrt the threading module.<g>

The loop that checks for messages in the queue is very tight in this
example,
but it would be run only periodically in the actual app.  Which is to be a
magnetic stripe card reading program, user swipes card through reader, data
comes in via serial port, handled by a threaded routine that passes the data
back to the display portion(main loop), which then formats the message,
displays it to the screen and then prints it out to a thermal printer.
producer -> transformer -> consumer.

Since the transformer/ui section will only be checking the loop periodically
and
I don't want to block on reading the queue since that would block the UI
loop.
After telling you this, am I still wrong on using get_nowait() ?

-Jeff






More information about the Python-list mailing list